ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjI1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS5jCkBAIC0wLDAgKzEsMjgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIHRla3JhbS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjIKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MDkgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKK3N0YXRpYyB2b2lkIHRla3JhbV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCB0ZWtyYW1fY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIHRla3JhbV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworI2RlZmluZSBURUtSQU1fMTE1MjAwIDB4MDAKKyNkZWZpbmUgVEVLUkFNXzU3NjAwICAweDAxCisjZGVmaW5lIFRFS1JBTV8zODQwMCAgMHgwMgorI2RlZmluZSBURUtSQU1fMTkyMDAgIDB4MDMKKyNkZWZpbmUgVEVLUkFNXzk2MDAgICAweDA0CisKKyNkZWZpbmUgVEVLUkFNX1BXICAgICAweDEwIC8qIFB1bHNlIHNlbGVjdCBiaXQgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfVEVLUkFNX0RPTkdMRSwKKwkub3BlbiAgPSB0ZWtyYW1fb3BlbiwKKwkuY2xvc2UgPSB0ZWtyYW1fY2xvc2UsCisJLnJlc2V0ID0gdGVrcmFtX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSB0ZWtyYW1fY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVrcmFtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVrcmFtX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgdGVrcmFtX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7IC8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICovCQorCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKK30KKworc3RhdGljIHZvaWQgdGVrcmFtX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKworCWlmIChzZWxmLT5yZXNldF90YXNrKQorCQlpcmRhX3Rhc2tfZGVsZXRlKHNlbGYtPnJlc2V0X3Rhc2spOworCWlmIChzZWxmLT5zcGVlZF90YXNrKQorCQlpcmRhX3Rhc2tfZGVsZXRlKHNlbGYtPnNwZWVkX3Rhc2spOworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX2NoYW5nZV9zcGVlZCAoZGV2LCBzdGF0ZSwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIFRla3JhbSBJUk1hdGUgMjEwIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIAorICogICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEKKyAqCisgKiAgICBBbGdvcml0aG0KKyAqICAgIDEuIGNsZWFyIERUUiAKKyAqICAgIDIuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDcgdXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBJUi0yMTAgdGhyb3VnaCBUWEQgdG8gc2V0IG5ldyBiYXVkIHJhdGUKKyAqICAgICAgIHdhaXQgdW50aWwgdGhlIHN0b3AgYml0IG9mIENvbnRyb2wgQnl0ZSBpcyBzZW50IChmb3IgOTYwMCBiYXVkIHJhdGUsIAorICogICAgICAgaXQgdGFrZXMgYWJvdXQgMTAwIG1zZWMpCisgKiAgICA1LiBjbGVhciBSVFMgKHJldHVybiB0byBOT1JNQUwgT3BlcmF0aW9uKQorICogICAgNi4gd2FpdCBhdCBsZWFzdCA1MCB1cywgbmV3IHNldHRpbmcgKGJhdWQgcmF0ZSwgZXRjKSB0YWtlcyBlZmZlY3QgaGVyZSAKKyAqICAgICAgIGFmdGVyCisgKi8KK3N0YXRpYyBpbnQgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwlfX3U4IGJ5dGU7CisJaW50IHJldCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKHNlbGYtPnNwZWVkX3Rhc2sgJiYgc2VsZi0+c3BlZWRfdGFzayAhPSB0YXNrKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZQorCQlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgOTYwMDoKKwkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fOTYwMDsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDoKKwkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMTkyMDA7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzM4NDAwOworCQlicmVhazsKKwljYXNlIDU3NjAwOgorCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV81NzYwMDsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6CisJCWJ5dGUgPSBURUtSQU1fMTE1MjAwOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwljYXNlIElSREFfVEFTS19DSElMRF9JTklUOgkJCisJCS8qIAorCQkgKiBOZWVkIHRvIHJlc2V0IHRoZSBkb25nbGUgYW5kIGdvIHRvIDk2MDAgYnBzIGJlZm9yZQorICAgICAgICAgICAgICAgICAqIHByb2dyYW1taW5nIAorCQkgKi8KKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIHRla3JhbV9yZXNldCwgTlVMTCwgdGFzaywgCisJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKQorCQl7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0gZWxzZQorCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9XQUlUOgorCQlJUkRBX1dBUk5JTkcoIiVzKCksIHJlc2V0dGluZyBkb25nbGUgdGltZWQgb3V0IVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0RPTkU6CisJCS8qIFNldCBEVFIsIENsZWFyIFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKKwkKKwkJLyogV2FpdCBhdCBsZWFzdCA3dXMgKi8KKwkJdWRlbGF5KDE0KTsKKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCAmYnl0ZSwgMSk7CisJCQorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisKKwkJLyogV2FpdCBhdCBsZWFzdCAxMDAgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxNTApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUOgorCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0ZWtyYW1fcmVzZXQgKGRyaXZlcikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSB0ZWtyYW0gZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIAorICogICAgICBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0ISEgCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBDbGVhciBSVFMgYW5kIERUUiwgYW5kIHdhaXQgNTAgbXMgKHBvd2VyIG9mZiB0aGUgSVItMjEwICkKKyAqICAgICAgICAxLiBjbGVhciBSVFMgCisgKiAgICAgICAgMi4gc2V0IERUUiwgYW5kIHdhaXQgYXQgbGVhc3QgMSBtcyAKKyAqICAgICAgICAzLiBjbGVhciBEVFIgdG8gU1BBQ0Ugc3RhdGUsIHdhaXQgYXQgbGVhc3QgNTAgdXMgZm9yIGZ1cnRoZXIgCisgKiAgICAgICAgIG9wZXJhdGlvbgorICovCitpbnQgdGVrcmFtX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2VsZi0+cmVzZXRfdGFzayAmJiBzZWxmLT5yZXNldF90YXNrICE9IHRhc2spIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gbXNlY3NfdG9famlmZmllcygxMCk7CisJfSBlbHNlCisJCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCQorCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwkvL3NlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CisKKwkJLyogU2xlZXAgNTAgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBDbGVhciBEVFIsIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7IAorCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CisJCQorCQkvKiBTaG91bGQgc2xlZXAgMSBtcyAqLworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQorCQkvKiBXYWl0IGF0IGxlYXN0IDUwIHVzICovCisJCXVkZWxheSg3NSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CQkKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRla3JhbSBJck1hdGUgSVItMjEwQiBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTAiKTsgLyogSVJEQV9URUtSQU1fRE9OR0xFICovCisJCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgVGVrcmFtIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQodGVrcmFtX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBUZWtyYW0gbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdCh0ZWtyYW1fY2xlYW51cCk7Cg==