LyoKICoJcHJvY2ZzIGhhbmRsZXIgZm9yIExpbnV4IEkyTyBzdWJzeXN0ZW0KICoKICoJKGMpIENvcHlyaWdodCAxOTk5CURlZXBhayBTYXhlbmEKICoKICoJT3JpZ2luYWxseSB3cml0dGVuIGJ5IERlZXBhayBTYXhlbmEoZGVlcGFrQHBsZXhpdHkubmV0KQogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgogKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglUaGlzIGlzIGFuIGluaXRpYWwgdGVzdCByZWxlYXNlLiBUaGUgY29kZSBpcyBiYXNlZCBvbiB0aGUgZGVzaWduIG9mIHRoZQogKglpZGUgcHJvY2ZzIHN5c3RlbSAoZHJpdmVycy9ibG9jay9pZGUtcHJvYy5jKS4gU29tZSBjb2RlIHRha2VuIGZyb20KICoJaTJvLWNvcmUgbW9kdWxlIGJ5IEFsYW4gQ294LgogKgogKglESVNDTEFJTUVSOiBUaGlzIGNvZGUgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQvdGVzdCBhbmQgbWF5IGNhdXNlCiAqCXlvdXIgc3lzdGVtIHRvIGJlaGF2ZSB1bnByZWRpY3RhYmx5LiAgVXNlIGF0IHlvdXIgb3duIGRpc2NyZXRpb24uCiAqCiAqCiAqCUZpeGVzL2FkZGl0aW9uczoKICoJCUp1aGEgU2llduRuZW4gKEp1aGEuU2lldmFuZW5AY3MuSGVsc2lua2kuRkkpLAogKgkJQXV2byBI5GtraW5lbiAoQXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GSSkKICoJCVVuaXZlcnNpdHkgb2YgSGVsc2lua2ksIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQogKgkJCUxBTiBlbnRyaWVzCiAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KICoJCQlDaGFuZ2VzIGZvciBuZXcgSTJPIEFQSQogKi8KCiNkZWZpbmUgT1NNX05BTUUJInByb2Mtb3NtIgojZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBQcm9jRlMgT1NNIgoKI2RlZmluZSBJMk9fTUFYX01PRFVMRVMgNAovLyBGSVhNRSEKI2RlZmluZSBGTVRfVTY0X0hFWCAiMHglMDh4JTA4eCIKI2RlZmluZSBVNjRfVkFMKHB1NjQpICooKHUzMiopKHB1NjQpKzEpLCAqKCh1MzIqKShwdTY0KSkKCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2kyby5oPgojaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgojaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgovKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgL3Byb2MgZW50cmllcyAqLwp0eXBlZGVmIHN0cnVjdCBfaTJvX3Byb2NfZW50cnlfdCB7CgljaGFyICpuYW1lOwkJLyogZW50cnkgbmFtZSAqLwoJbW9kZV90IG1vZGU7CQkvKiBtb2RlICovCglzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOwkvKiBvcGVuIGZ1bmN0aW9uICovCn0gaTJvX3Byb2NfZW50cnk7CgovKiBnbG9iYWwgSTJPIC9wcm9jL2kybyBlbnRyeSAqLwpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMm9fcHJvY19kaXJfcm9vdDsKCi8qIHByb2MgT1NNIGRyaXZlciBzdHJ1Y3QgKi8Kc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19wcm9jX2RyaXZlciA9IHsKCS5uYW1lID0gT1NNX05BTUUsCn07CgpzdGF0aWMgaW50IHByaW50X3NlcmlhbF9udW1iZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIHU4ICogc2VyaWFsbm8sIGludCBtYXhfbGVuKQp7CglpbnQgaTsKCgkvKiAxOTk5MDQxOSAtc3JhbHN0b24KCSAqICAgICAgVGhlIEkyTyB2MS41IChhbmQgdjIuMCBzbyBmYXIpICJvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIgoJICogICAgICBnb3Qgc2VyaWFsIG51bWJlcnMgV1JPTkchCgkgKiAgICAgIEFwcGFyZW50bHksIGFuZCBkZXNwaXRlIHdoYXQgU2VjdGlvbiAzLjQuNCBzYXlzIGFuZAoJICogICAgICBGaWd1cmUgMy0zNSBzaG93cyAocGcgMy0zOSBpbiB0aGUgcGRmIGRvYyksCgkgKiAgICAgIHRoZSBjb252ZW50aW9uIC8gY29uc2Vuc3VzIHNlZW1zIHRvIGJlOgoJICogICAgICAgICsgRmlyc3QgYnl0ZSBpcyBTTkZvcm1hdAoJICogICAgICAgICsgU2Vjb25kIGJ5dGUgaXMgU05MZW4gKGJ1dCBvbmx5IGlmIFNORm9ybWF0PT03ICg/KSkKCSAqICAgICAgICArICh2Mi4wKSBTQ1NJK0JTIG1heSB1c2UgSUVFRSBSZWdpc3RlcmVkICg2NCBvciAxMjggYml0KSBmb3JtYXQKCSAqLwoJc3dpdGNoIChzZXJpYWxub1swXSkgewoJY2FzZSBJMk9fU05GT1JNQVRfQklOQVJZOgkvKiBCaW5hcnkgKi8KCQlzZXFfcHJpbnRmKHNlcSwgIjB4Iik7CgkJZm9yIChpID0gMDsgaSA8IHNlcmlhbG5vWzFdOyBpKyspIHsKCQkJc2VxX3ByaW50ZihzZXEsICIlMDJYIiwgc2VyaWFsbm9bMiArIGldKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBJMk9fU05GT1JNQVRfQVNDSUk6CS8qIEFTQ0lJICovCgkJaWYgKHNlcmlhbG5vWzFdIDwgJyAnKSB7CS8qIHByaW50YWJsZSBvciBTTkxlbj8gKi8KCQkJLyogc2FuaXR5ICovCgkJCW1heF9sZW4gPQoJCQkgICAgKG1heF9sZW4gPCBzZXJpYWxub1sxXSkgPyBtYXhfbGVuIDogc2VyaWFsbm9bMV07CgkJCXNlcmlhbG5vWzEgKyBtYXhfbGVuXSA9ICdcMCc7CgoJCQkvKiBqdXN0IHByaW50IGl0ICovCgkJCXNlcV9wcmludGYoc2VxLCAiJXMiLCAmc2VyaWFsbm9bMl0pOwoJCX0gZWxzZSB7CgkJCS8qIHByaW50IGNoYXJzIGZvciBzcGVjaWZpZWQgbGVuZ3RoICovCgkJCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxub1sxXTsgaSsrKSB7CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiVjIiwgc2VyaWFsbm9bMiArIGldKTsKCQkJfQoJCX0KCQlicmVhazsKCgljYXNlIEkyT19TTkZPUk1BVF9VTklDT0RFOgkvKiBVTklDT0RFICovCgkJc2VxX3ByaW50ZihzZXEsICJVTklDT0RFIEZvcm1hdC4gIENhbid0IERpc3BsYXlcbiIpOwoJCWJyZWFrOwoKCWNhc2UgSTJPX1NORk9STUFUX0xBTjQ4X01BQzoJLyogTEFOLTQ4IE1BQyBBZGRyZXNzICovCgkJc2VxX3ByaW50ZihzZXEsCgkJCSAgICJMQU4tNDggTUFDIGFkZHJlc3MgQCAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCgkJCSAgIHNlcmlhbG5vWzJdLCBzZXJpYWxub1szXSwKCQkJICAgc2VyaWFsbm9bNF0sIHNlcmlhbG5vWzVdLCBzZXJpYWxub1s2XSwgc2VyaWFsbm9bN10pOwoJCWJyZWFrOwoKCWNhc2UgSTJPX1NORk9STUFUX1dBTjoJLyogV0FOIE1BQyBBZGRyZXNzICovCgkJLyogRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCBhIFdBTiBhY2Nlc3MgYWRkcmVzcyBsb29rcyBsaWtlPz8gKi8KCQlzZXFfcHJpbnRmKHNlcSwgIldBTiBBY2Nlc3MgQWRkcmVzcyIpOwoJCWJyZWFrOwoKLyogcGx1cyBuZXcgaW4gdjIuMCAqLwoJY2FzZSBJMk9fU05GT1JNQVRfTEFONjRfTUFDOgkvKiBMQU4tNjQgTUFDIEFkZHJlc3MgKi8KCQkvKiBGSVhNRTogRmlndXJlIG91dCB3aGF0IGEgTEFOLTY0IGFkZHJlc3MgcmVhbGx5IGxvb2tzIGxpa2U/PyAqLwoJCXNlcV9wcmludGYoc2VxLAoJCQkgICAiTEFOLTY0IE1BQyBhZGRyZXNzIEAgWz86JTAyWDolMDJYOj9dICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKCQkJICAgc2VyaWFsbm9bOF0sIHNlcmlhbG5vWzldLAoJCQkgICBzZXJpYWxub1syXSwgc2VyaWFsbm9bM10sCgkJCSAgIHNlcmlhbG5vWzRdLCBzZXJpYWxub1s1XSwgc2VyaWFsbm9bNl0sIHNlcmlhbG5vWzddKTsKCQlicmVhazsKCgljYXNlIEkyT19TTkZPUk1BVF9ERE06CS8qIEkyTyBERE0gKi8KCQlzZXFfcHJpbnRmKHNlcSwKCQkJICAgIkRETTogVGlkPSUwM1hoLCBSc3ZkPSUwNFhoLCBPcmdJZD0lMDRYaCIsCgkJCSAgICoodTE2ICopICYgc2VyaWFsbm9bMl0sCgkJCSAgICoodTE2ICopICYgc2VyaWFsbm9bNF0sICoodTE2ICopICYgc2VyaWFsbm9bNl0pOwoJCWJyZWFrOwoKCWNhc2UgSTJPX1NORk9STUFUX0lFRUVfUkVHNjQ6CS8qIElFRUUgUmVnaXN0ZXJlZCAoNjQtYml0KSAqLwoJY2FzZSBJMk9fU05GT1JNQVRfSUVFRV9SRUcxMjg6CS8qIElFRUUgUmVnaXN0ZXJlZCAoMTI4LWJpdCkgKi8KCQkvKiBGSVhNRTogRmlndXJlIGlmIHRoaXMgaXMgZXZlbiBjbG9zZT8/ICovCgkJc2VxX3ByaW50ZihzZXEsCgkJCSAgICJJRUVFIE5vZGVOYW1lKGhpLGxvKT0oJTA4WGg6JTA4WGgpLCBQb3J0TmFtZShoaSxsbyk9KCUwOFhoOiUwOFhoKVxuIiwKCQkJICAgKih1MzIgKikgJiBzZXJpYWxub1syXSwKCQkJICAgKih1MzIgKikgJiBzZXJpYWxub1s2XSwKCQkJICAgKih1MzIgKikgJiBzZXJpYWxub1sxMF0sICoodTMyICopICYgc2VyaWFsbm9bMTRdKTsKCQlicmVhazsKCgljYXNlIEkyT19TTkZPUk1BVF9VTktOT1dOOgkvKiBVbmtub3duIDAgICAgKi8KCWNhc2UgSTJPX1NORk9STUFUX1VOS05PV04yOgkvKiBVbmtub3duIDB4ZmYgKi8KCWRlZmF1bHQ6CgkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duIGRhdGEgZm9ybWF0ICgweCUwMngpIiwgc2VyaWFsbm9bMF0pOwoJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9CgovKioKICoJaTJvX2dldF9jbGFzc19uYW1lIC0gCWRvIGkybyBjbGFzcyBuYW1lIGxvb2t1cAogKglAY2xhc3M6IGNsYXNzIG51bWJlcgogKgogKglSZXR1cm4gYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIGFuIGkybyBjbGFzcwogKi8Kc3RhdGljIGNvbnN0IGNoYXIgKmkyb19nZXRfY2xhc3NfbmFtZShpbnQgY2xhc3MpCnsKCWludCBpZHggPSAxNjsKCXN0YXRpYyBjaGFyICppMm9fY2xhc3NfbmFtZVtdID0gewoJCSJFeGVjdXRpdmUiLAoJCSJEZXZpY2UgRHJpdmVyIE1vZHVsZSIsCgkJIkJsb2NrIERldmljZSIsCgkJIlRhcGUgRGV2aWNlIiwKCQkiTEFOIEludGVyZmFjZSIsCgkJIldBTiBJbnRlcmZhY2UiLAoJCSJGaWJyZSBDaGFubmVsIFBvcnQiLAoJCSJGaWJyZSBDaGFubmVsIERldmljZSIsCgkJIlNDU0kgRGV2aWNlIiwKCQkiQVRFIFBvcnQiLAoJCSJBVEUgRGV2aWNlIiwKCQkiRmxvcHB5IENvbnRyb2xsZXIiLAoJCSJGbG9wcHkgRGV2aWNlIiwKCQkiU2Vjb25kYXJ5IEJ1cyBQb3J0IiwKCQkiUGVlciBUcmFuc3BvcnQgQWdlbnQiLAoJCSJQZWVyIFRyYW5zcG9ydCIsCgkJIlVua25vd24iCgl9OwoKCXN3aXRjaCAoY2xhc3MgJiAweGZmZikgewoJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgoJCWlkeCA9IDA7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19ERE06CgkJaWR4ID0gMTsKCQlicmVhazsKCWNhc2UgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFOgoJCWlkeCA9IDI7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19TRVFVRU5USUFMX1NUT1JBR0U6CgkJaWR4ID0gMzsKCQlicmVhazsKCWNhc2UgSTJPX0NMQVNTX0xBTjoKCQlpZHggPSA0OwoJCWJyZWFrOwoJY2FzZSBJMk9fQ0xBU1NfV0FOOgoJCWlkeCA9IDU7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BPUlQ6CgkJaWR4ID0gNjsKCQlicmVhazsKCWNhc2UgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTDoKCQlpZHggPSA3OwoJCWJyZWFrOwoJY2FzZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMOgoJCWlkeCA9IDg7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19BVEVfUE9SVDoKCQlpZHggPSA5OwoJCWJyZWFrOwoJY2FzZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUw6CgkJaWR4ID0gMTA7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUjoKCQlpZHggPSAxMTsKCQlicmVhazsKCWNhc2UgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0U6CgkJaWR4ID0gMTI7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19CVVNfQURBUFRFUl9QT1JUOgoJCWlkeCA9IDEzOwoJCWJyZWFrOwoJY2FzZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlRfQUdFTlQ6CgkJaWR4ID0gMTQ7CgkJYnJlYWs7CgljYXNlIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVDoKCQlpZHggPSAxNTsKCQlicmVhazsKCX0KCglyZXR1cm4gaTJvX2NsYXNzX25hbWVbaWR4XTsKfQoKI2RlZmluZSBTQ1NJX1RBQkxFX1NJWkUJMTMKc3RhdGljIGNoYXIgKnNjc2lfZGV2aWNlc1tdID0gewoJIkRpcmVjdC1BY2Nlc3MgUmVhZC9Xcml0ZSIsCgkiU2VxdWVudGlhbC1BY2Nlc3MgU3RvcmFnZSIsCgkiUHJpbnRlciIsCgkiUHJvY2Vzc29yIiwKCSJXT1JNIERldmljZSIsCgkiQ0QtUk9NIERldmljZSIsCgkiU2Nhbm5lciBEZXZpY2UiLAoJIk9wdGljYWwgTWVtb3J5IERldmljZSIsCgkiTWVkaXVtIENoYW5nZXIgRGV2aWNlIiwKCSJDb21tdW5pY2F0aW9ucyBEZXZpY2UiLAoJIkdyYXBoaWNzIEFydCBQcmUtUHJlc3MgRGV2aWNlIiwKCSJHcmFwaGljcyBBcnQgUHJlLVByZXNzIERldmljZSIsCgkiQXJyYXkgQ29udHJvbGxlciBEZXZpY2UiCn07CgpzdGF0aWMgY2hhciAqY2h0b3N0cih1OCAqIGNoYXJzLCBpbnQgbikKewoJY2hhciB0bXBbMjU2XTsKCXRtcFswXSA9IDA7CglyZXR1cm4gc3RybmNhdCh0bXAsIChjaGFyICopY2hhcnMsIG4pOwp9CgpzdGF0aWMgaW50IGkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBpbnQgYmxvY2tfc3RhdHVzLAoJCQkJICAgY2hhciAqZ3JvdXApCnsKCXN3aXRjaCAoYmxvY2tfc3RhdHVzKSB7CgljYXNlIC1FVElNRURPVVQ6CgkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiVGltZW91dCByZWFkaW5nIGdyb3VwICVzLlxuIiwgZ3JvdXApOwoJY2FzZSAtRU5PTUVNOgoJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIk5vIGZyZWUgbWVtb3J5IHRvIHJlYWQgdGhlIHRhYmxlLlxuIik7CgljYXNlIC1JMk9fUEFSQU1TX1NUQVRVU19JTlZBTElEX0dST1VQX0lEOgoJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkdyb3VwICVzIG5vdCBzdXBwb3J0ZWQuXG4iLCBncm91cCk7CglkZWZhdWx0OgoJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwKCQkJCSAgIkVycm9yIHJlYWRpbmcgZ3JvdXAgJXMuIEJsb2NrU3RhdHVzIDB4JTAyWFxuIiwKCQkJCSAgZ3JvdXAsIC1ibG9ja19zdGF0dXMpOwoJfQp9CgpzdGF0aWMgY2hhciAqYnVzX3N0cmluZ3NbXSA9IHsKCSJMb2NhbCBCdXMiLAoJIklTQSIsCgkiRUlTQSIsCgkiTUNBIiwKCSJQQ0kiLAoJIlBDTUNJQSIsCgkiTlVCVVMiLAoJIkNBUkRCVVMiCn07CgpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19ocnQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7CglpMm9faHJ0ICpocnQgPSAoaTJvX2hydCAqKSBjLT5ocnQudmlydDsKCXUzMiBidXM7CglpbnQgaTsKCglpZiAoaHJ0LT5ocnRfdmVyc2lvbikgewoJCXNlcV9wcmludGYoc2VxLAoJCQkgICAiSFJUIHRhYmxlIGZvciBjb250cm9sbGVyIGlzIHRvbyBuZXcgYSB2ZXJzaW9uLlxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJc2VxX3ByaW50ZihzZXEsICJIUlQgaGFzICVkIGVudHJpZXMgb2YgJWQgYnl0ZXMgZWFjaC5cbiIsCgkJICAgaHJ0LT5udW1fZW50cmllcywgaHJ0LT5lbnRyeV9sZW4gPDwgMik7CgoJZm9yIChpID0gMDsgaSA8IGhydC0+bnVtX2VudHJpZXM7IGkrKykgewoJCXNlcV9wcmludGYoc2VxLCAiRW50cnkgJWQ6XG4iLCBpKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiAgIEFkYXB0ZXIgSUQ6ICUwIzEweFxuIiwKCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYWRhcHRlcl9pZCk7CgkJc2VxX3ByaW50ZihzZXEsICIgICBDb250cm9sbGluZyB0aWQ6ICUwIzZ4XG4iLAoJCQkgICBocnQtPmhydF9lbnRyeVtpXS5wYXJlbnRfdGlkKTsKCgkJaWYgKGhydC0+aHJ0X2VudHJ5W2ldLmJ1c190eXBlICE9IDB4ODApIHsKCQkJYnVzID0gaHJ0LT5ocnRfZW50cnlbaV0uYnVzX3R5cGU7CgkJCXNlcV9wcmludGYoc2VxLCAiICAgJXMgSW5mb3JtYXRpb25cbiIsCgkJCQkgICBidXNfc3RyaW5nc1tidXNdKTsKCgkJCXN3aXRjaCAoYnVzKSB7CgkJCWNhc2UgSTJPX0JVU19MT0NBTDoKCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBJT0Jhc2U6ICUwIzZ4LCIsCgkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmxvY2FsX2J1cy4KCQkJCQkgICBMYkJhc2VJT1BvcnQpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4XG4iLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5sb2NhbF9idXMuCgkJCQkJICAgTGJCYXNlTWVtb3J5QWRkcmVzcyk7CgkJCQlicmVhazsKCgkJCWNhc2UgSTJPX0JVU19JU0E6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgSU9CYXNlOiAlMCM2eCwiLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5pc2FfYnVzLgoJCQkJCSAgIElzYUJhc2VJT1BvcnQpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4LCIsCgkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmlzYV9idXMuCgkJCQkJICAgSXNhQmFzZU1lbW9yeUFkZHJlc3MpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgQ1NOOiAlMCM0eCwiLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5pc2FfYnVzLkNTTik7CgkJCQlicmVhazsKCgkJCWNhc2UgSTJPX0JVU19FSVNBOgoJCQkJc2VxX3ByaW50ZihzZXEsICIgICAgIElPQmFzZTogJTAjNngsIiwKCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMuZWlzYV9idXMuCgkJCQkJICAgRWlzYUJhc2VJT1BvcnQpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4LCIsCgkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmVpc2FfYnVzLgoJCQkJCSAgIEVpc2FCYXNlTWVtb3J5QWRkcmVzcyk7CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiBTbG90OiAlMCM0eCwiLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5laXNhX2J1cy4KCQkJCQkgICBFaXNhU2xvdE51bWJlcik7CgkJCQlicmVhazsKCgkJCWNhc2UgSTJPX0JVU19NQ0E6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgSU9CYXNlOiAlMCM2eCwiLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5tY2FfYnVzLgoJCQkJCSAgIE1jYUJhc2VJT1BvcnQpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4LCIsCgkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLm1jYV9idXMuCgkJCQkJICAgTWNhQmFzZU1lbW9yeUFkZHJlc3MpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgU2xvdDogJTAjNHgsIiwKCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMubWNhX2J1cy4KCQkJCQkgICBNY2FTbG90TnVtYmVyKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBJMk9fQlVTX1BDSToKCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBCdXM6ICUwIzR4IiwKCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KCQkJCQkgICBQY2lCdXNOdW1iZXIpOwoJCQkJc2VxX3ByaW50ZihzZXEsICIgRGV2OiAlMCM0eCIsCgkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLnBjaV9idXMuCgkJCQkJICAgUGNpRGV2aWNlTnVtYmVyKTsKCQkJCXNlcV9wcmludGYoc2VxLCAiIEZ1bmM6ICUwIzR4IiwKCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KCQkJCQkgICBQY2lGdW5jdGlvbk51bWJlcik7CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiBWZW5kb3I6ICUwIzZ4IiwKCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KCQkJCQkgICBQY2lWZW5kb3JJRCk7CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiBEZXZpY2U6ICUwIzZ4XG4iLAoJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5wY2lfYnVzLgoJCQkJCSAgIFBjaURldmljZUlEKTsKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICAgVW5zdXBwb3J0ZWQgQnVzIFR5cGVcbiIpOwoJCQl9CgkJfSBlbHNlCgkJCXNlcV9wcmludGYoc2VxLCAiICAgVW5rbm93biBCdXMgVHlwZVxuIik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2xjdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKCWkyb19sY3QgKmxjdCA9IChpMm9fbGN0ICopIGMtPmxjdDsKCWludCBlbnRyaWVzOwoJaW50IGk7CgojZGVmaW5lIEJVU19UQUJMRV9TSVpFIDMKCXN0YXRpYyBjaGFyICpidXNfcG9ydHNbXSA9IHsKCQkiR2VuZXJpYyBCdXMiLAoJCSJTQ1NJIEJ1cyIsCgkJIkZpYnJlIENoYW5uZWwgQnVzIgoJfTsKCgllbnRyaWVzID0gKGxjdC0+dGFibGVfc2l6ZSAtIDMpIC8gOTsKCglzZXFfcHJpbnRmKHNlcSwgIkxDVCBjb250YWlucyAlZCAlc1xuIiwgZW50cmllcywKCQkgICBlbnRyaWVzID09IDEgPyAiZW50cnkiIDogImVudHJpZXMiKTsKCWlmIChsY3QtPmJvb3RfdGlkKQoJCXNlcV9wcmludGYoc2VxLCAiQm9vdCBEZXZpY2UgQCBJRCAlZFxuIiwgbGN0LT5ib290X3RpZCk7CgoJc2VxX3ByaW50ZihzZXEsICJDdXJyZW50IENoYW5nZSBJbmRpY2F0b3I6ICUjMTB4XG4iLCBsY3QtPmNoYW5nZV9pbmQpOwoKCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKCQlzZXFfcHJpbnRmKHNlcSwgIkVudHJ5ICVkXG4iLCBpKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiAgQ2xhc3MsIFN1YkNsYXNzICA6ICVzIiwKCQkJICAgaTJvX2dldF9jbGFzc19uYW1lKGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkKSk7CgoJCS8qCgkJICogICAgICBDbGFzc2VzIHdoaWNoIHdlJ2xsIHByaW50IHN1YmNsYXNzIGluZm8gZm9yCgkJICovCgkJc3dpdGNoIChsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCAmIDB4RkZGKSB7CgkJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CgkJCXN3aXRjaCAobGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzKSB7CgkJCWNhc2UgMHgwMDoKCQkJCXNlcV9wcmludGYoc2VxLCAiLCBEaXJlY3QtQWNjZXNzIFJlYWQvV3JpdGUiKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAweDA0OgoJCQkJc2VxX3ByaW50ZihzZXEsICIsIFdPUk0gRHJpdmUiKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAweDA1OgoJCQkJc2VxX3ByaW50ZihzZXEsICIsIENELVJPTSBEcml2ZSIpOwoJCQkJYnJlYWs7CgoJCQljYXNlIDB4MDc6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgT3B0aWNhbCBNZW1vcnkgRGV2aWNlIik7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgVW5rbm93biAoMHglMDJ4KSIsCgkJCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIEkyT19DTEFTU19MQU46CgkJCXN3aXRjaCAobGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzICYgMHhGRikgewoJCQljYXNlIDB4MzA6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgRXRoZXJuZXQiKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAweDQwOgoJCQkJc2VxX3ByaW50ZihzZXEsICIsIDEwMGJhc2UgVkciKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAweDUwOgoJCQkJc2VxX3ByaW50ZihzZXEsICIsIElFRUUgODAyLjUvVG9rZW4tUmluZyIpOwoJCQkJYnJlYWs7CgoJCQljYXNlIDB4NjA6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgQU5TSSBYM1Q5LjUgRkRESSIpOwoJCQkJYnJlYWs7CgoJCQljYXNlIDB4NzA6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgRmlicmUgQ2hhbm5lbCIpOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJc2VxX3ByaW50ZihzZXEsICIsIFVua25vd24gU3ViLUNsYXNzICgweCUwMngpIiwKCQkJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MgJiAweEZGKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CgkJCWlmIChsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MgPCBTQ1NJX1RBQkxFX1NJWkUpCgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgJXMiLAoJCQkJCSAgIHNjc2lfZGV2aWNlc1tsY3QtPmxjdF9lbnRyeVtpXS4KCQkJCQkJCXN1Yl9jbGFzc10pOwoJCQllbHNlCgkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgVW5rbm93biBEZXZpY2UgVHlwZSIpOwoJCQlicmVhazsKCgkJY2FzZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVDoKCQkJaWYgKGxjdC0+bGN0X2VudHJ5W2ldLnN1Yl9jbGFzcyA8IEJVU19UQUJMRV9TSVpFKQoJCQkJc2VxX3ByaW50ZihzZXEsICIsICVzIiwKCQkJCQkgICBidXNfcG9ydHNbbGN0LT5sY3RfZW50cnlbaV0uCgkJCQkJCSAgICAgc3ViX2NsYXNzXSk7CgkJCWVsc2UKCQkJCXNlcV9wcmludGYoc2VxLCAiLCBVbmtub3duIEJ1cyBUeXBlIik7CgkJCWJyZWFrOwoJCX0KCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CgoJCXNlcV9wcmludGYoc2VxLCAiICBMb2NhbCBUSUQgICAgICAgIDogMHglMDN4XG4iLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS50aWQpOwoJCXNlcV9wcmludGYoc2VxLCAiICBVc2VyIFRJRCAgICAgICAgIDogMHglMDN4XG4iLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS51c2VyX3RpZCk7CgkJc2VxX3ByaW50ZihzZXEsICIgIFBhcmVudCBUSUQgICAgICAgOiAweCUwM3hcbiIsCgkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLnBhcmVudF90aWQpOwoJCXNlcV9wcmludGYoc2VxLCAiICBJZGVudGl0eSBUYWcgICAgIDogMHgleCV4JXgleCV4JXgleCV4XG4iLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbMF0sCgkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmlkZW50aXR5X3RhZ1sxXSwKCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzJdLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbM10sCgkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmlkZW50aXR5X3RhZ1s0XSwKCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzVdLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbNl0sCgkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmlkZW50aXR5X3RhZ1s3XSk7CgkJc2VxX3ByaW50ZihzZXEsICIgIENoYW5nZSBJbmRpY2F0b3IgOiAlMCMxMHhcbiIsCgkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmNoYW5nZV9pbmQpOwoJCXNlcV9wcmludGYoc2VxLCAiICBFdmVudCBDYXBhYiBNYXNrIDogJTAjMTB4XG4iLAoJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5kZXZpY2VfZmxhZ3MpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19zdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7CgljaGFyIHByb2RzdHJbMjVdOwoJaW50IHZlcnNpb247CglpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwoKCWkyb19zdGF0dXNfZ2V0KGMpOwkvLyByZXJlYWQgdGhlIHN0YXR1cyBibG9jawoKCXNlcV9wcmludGYoc2VxLCAiT3JnYW5pemF0aW9uIElEICAgICAgICA6ICUwIzZ4XG4iLCBzYi0+b3JnX2lkKTsKCgl2ZXJzaW9uID0gc2ItPmkyb192ZXJzaW9uOwoKLyogRklYTUUgZm9yIFNwZWMgMi4wCglpZiAodmVyc2lvbiA9PSAweDAyKSB7CgkJc2VxX3ByaW50ZihzZXEsICJMb3dlc3QgSTJPIHZlcnNpb24gc3VwcG9ydGVkOiAiKTsKCQlzd2l0Y2god29ya3NwYWNlWzJdKSB7CgkJCWNhc2UgMHgwMDoKCQkJCXNlcV9wcmludGYoc2VxLCAiMS4wXG4iKTsKCQkJCWJyZWFrOwoJCQljYXNlIDB4MDE6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIjEuNVxuIik7CgkJCQlicmVhazsKCQkJY2FzZSAweDAyOgoJCQkJc2VxX3ByaW50ZihzZXEsICIyLjBcbiIpOwoJCQkJYnJlYWs7CgkJfQoKCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2hlc3QgSTJPIHZlcnNpb24gc3VwcG9ydGVkOiAiKTsKCQlzd2l0Y2god29ya3NwYWNlWzNdKSB7CgkJCWNhc2UgMHgwMDoKCQkJCXNlcV9wcmludGYoc2VxLCAiMS4wXG4iKTsKCQkJCWJyZWFrOwoJCQljYXNlIDB4MDE6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIjEuNVxuIik7CgkJCQlicmVhazsKCQkJY2FzZSAweDAyOgoJCQkJc2VxX3ByaW50ZihzZXEsICIyLjBcbiIpOwoJCQkJYnJlYWs7CgkJfQoJfQoqLwoJc2VxX3ByaW50ZihzZXEsICJJT1AgSUQgICAgICAgICAgICAgICAgIDogJTAjNXhcbiIsIHNiLT5pb3BfaWQpOwoJc2VxX3ByaW50ZihzZXEsICJIb3N0IFVuaXQgSUQgICAgICAgICAgIDogJTAjNnhcbiIsIHNiLT5ob3N0X3VuaXRfaWQpOwoJc2VxX3ByaW50ZihzZXEsICJTZWdtZW50IE51bWJlciAgICAgICAgIDogJTAjNXhcbiIsIHNiLT5zZWdtZW50X251bWJlcik7CgoJc2VxX3ByaW50ZihzZXEsICJJMk8gdmVyc2lvbiAgICAgICAgICAgIDogIik7Cglzd2l0Y2ggKHZlcnNpb24pIHsKCWNhc2UgMHgwMDoKCQlzZXFfcHJpbnRmKHNlcSwgIjEuMFxuIik7CgkJYnJlYWs7CgljYXNlIDB4MDE6CgkJc2VxX3ByaW50ZihzZXEsICIxLjVcbiIpOwoJCWJyZWFrOwoJY2FzZSAweDAyOgoJCXNlcV9wcmludGYoc2VxLCAiMi4wXG4iKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duIHZlcnNpb25cbiIpOwoJfQoKCXNlcV9wcmludGYoc2VxLCAiSU9QIFN0YXRlICAgICAgICAgICAgICA6ICIpOwoJc3dpdGNoIChzYi0+aW9wX3N0YXRlKSB7CgljYXNlIDB4MDE6CgkJc2VxX3ByaW50ZihzZXEsICJJTklUXG4iKTsKCQlicmVhazsKCgljYXNlIDB4MDI6CgkJc2VxX3ByaW50ZihzZXEsICJSRVNFVFxuIik7CgkJYnJlYWs7CgoJY2FzZSAweDA0OgoJCXNlcV9wcmludGYoc2VxLCAiSE9MRFxuIik7CgkJYnJlYWs7CgoJY2FzZSAweDA1OgoJCXNlcV9wcmludGYoc2VxLCAiUkVBRFlcbiIpOwoJCWJyZWFrOwoKCWNhc2UgMHgwODoKCQlzZXFfcHJpbnRmKHNlcSwgIk9QRVJBVElPTkFMXG4iKTsKCQlicmVhazsKCgljYXNlIDB4MTA6CgkJc2VxX3ByaW50ZihzZXEsICJGQUlMRURcbiIpOwoJCWJyZWFrOwoKCWNhc2UgMHgxMToKCQlzZXFfcHJpbnRmKHNlcSwgIkZBVUxURURcbiIpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duXG4iKTsKCQlicmVhazsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIk1lc3NlbmdlciBUeXBlICAgICAgICAgOiAiKTsKCXN3aXRjaCAoc2ItPm1zZ190eXBlKSB7CgljYXNlIDB4MDA6CgkJc2VxX3ByaW50ZihzZXEsICJNZW1vcnkgbWFwcGVkXG4iKTsKCQlicmVhazsKCWNhc2UgMHgwMToKCQlzZXFfcHJpbnRmKHNlcSwgIk1lbW9yeSBtYXBwZWQgb25seVxuIik7CgkJYnJlYWs7CgljYXNlIDB4MDI6CgkJc2VxX3ByaW50ZihzZXEsICJSZW1vdGUgb25seVxuIik7CgkJYnJlYWs7CgljYXNlIDB4MDM6CgkJc2VxX3ByaW50ZihzZXEsICJNZW1vcnkgbWFwcGVkIGFuZCByZW1vdGVcbiIpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd25cbiIpOwoJfQoKCXNlcV9wcmludGYoc2VxLCAiSW5ib3VuZCBGcmFtZSBTaXplICAgICA6ICVkIGJ5dGVzXG4iLAoJCSAgIHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUgPDwgMik7CglzZXFfcHJpbnRmKHNlcSwgIk1heCBJbmJvdW5kIEZyYW1lcyAgICAgOiAlZFxuIiwKCQkgICBzYi0+bWF4X2luYm91bmRfZnJhbWVzKTsKCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBJbmJvdW5kIEZyYW1lcyA6ICVkXG4iLAoJCSAgIHNiLT5jdXJfaW5ib3VuZF9mcmFtZXMpOwoJc2VxX3ByaW50ZihzZXEsICJNYXggT3V0Ym91bmQgRnJhbWVzICAgIDogJWRcbiIsCgkJICAgc2ItPm1heF9vdXRib3VuZF9mcmFtZXMpOwoKCS8qIFNwZWMgZG9lc24ndCBzYXkgaWYgTlVMTCB0ZXJtaW5hdGVkIG9yIG5vdC4uLiAqLwoJbWVtY3B5KHByb2RzdHIsIHNiLT5wcm9kdWN0X2lkLCAyNCk7Cglwcm9kc3RyWzI0XSA9ICdcMCc7CglzZXFfcHJpbnRmKHNlcSwgIlByb2R1Y3QgSUQgICAgICAgICAgICAgOiAlc1xuIiwgcHJvZHN0cik7CglzZXFfcHJpbnRmKHNlcSwgIkV4cGVjdGVkIExDVCBTaXplICAgICAgOiAlZCBieXRlc1xuIiwKCQkgICBzYi0+ZXhwZWN0ZWRfbGN0X3NpemUpOwoKCXNlcV9wcmludGYoc2VxLCAiSU9QIENhcGFiaWxpdGllc1xuIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBDb250ZXh0IEZpZWxkIFNpemUgU3VwcG9ydCA6ICIpOwoJc3dpdGNoIChzYi0+aW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMykgewoJY2FzZSAwOgoJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgb25seSAzMi1iaXQgY29udGV4dCBmaWVsZHNcbiIpOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgb25seSA2NC1iaXQgY29udGV4dCBmaWVsZHNcbiIpOwoJCWJyZWFrOwoJY2FzZSAyOgoJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgMzItYml0IGFuZCA2NC1iaXQgY29udGV4dCBmaWVsZHMsICIKCQkJICAgImJ1dCBub3QgY29uY3VycmVudGx5XG4iKTsKCQlicmVhazsKCWNhc2UgMzoKCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIDMyLWJpdCBhbmQgNjQtYml0IGNvbnRleHQgZmllbGRzICIKCQkJICAgImNvbmN1cnJlbnRseVxuIik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXNlcV9wcmludGYoc2VxLCAiMHglMDh4XG4iLCBzYi0+aW9wX2NhcGFiaWxpdGllcyk7Cgl9CglzZXFfcHJpbnRmKHNlcSwgIiAgICBDdXJyZW50IENvbnRleHQgRmllbGQgU2l6ZSA6ICIpOwoJc3dpdGNoIChzYi0+aW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMEMpIHsKCWNhc2UgMDoKCQlzZXFfcHJpbnRmKHNlcSwgIm5vdCBjb25maWd1cmVkXG4iKTsKCQlicmVhazsKCWNhc2UgNDoKCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgMzItYml0IGNvbnRleHQgZmllbGRzXG4iKTsKCQlicmVhazsKCWNhc2UgODoKCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgNjQtYml0IGNvbnRleHQgZmllbGRzXG4iKTsKCQlicmVhazsKCWNhc2UgMTI6CgkJc2VxX3ByaW50ZihzZXEsICJTdXBwb3J0cyBib3RoIDMyLWJpdCBvciA2NC1iaXQgY29udGV4dCBmaWVsZHMgIgoJCQkgICAiY29uY3VycmVudGx5XG4iKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwoJfQoJc2VxX3ByaW50ZihzZXEsICIgICAgSW5ib3VuZCBQZWVyIFN1cHBvcnQgICAgICAgOiAlc1xuIiwKCQkgICAoc2ItPgoJCSAgICBpb3BfY2FwYWJpbGl0aWVzICYgMHgwMDAwMDAxMCkgPyAiU3VwcG9ydGVkIiA6CgkJICAgIk5vdCBzdXBwb3J0ZWQiKTsKCXNlcV9wcmludGYoc2VxLCAiICAgIE91dGJvdW5kIFBlZXIgU3VwcG9ydCAgICAgIDogJXNcbiIsCgkJICAgKHNiLT4KCQkgICAgaW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMjApID8gIlN1cHBvcnRlZCIgOgoJCSAgICJOb3Qgc3VwcG9ydGVkIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBQZWVyIHRvIFBlZXIgU3VwcG9ydCAgICAgICA6ICVzXG4iLAoJCSAgIChzYi0+CgkJICAgIGlvcF9jYXBhYmlsaXRpZXMgJiAweDAwMDAwMDQwKSA/ICJTdXBwb3J0ZWQiIDoKCQkgICAiTm90IHN1cHBvcnRlZCIpOwoKCXNlcV9wcmludGYoc2VxLCAiRGVzaXJlZCBwcml2YXRlIG1lbW9yeSBzaXplICAgOiAlZCBrQlxuIiwKCQkgICBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSA+PiAxMCk7CglzZXFfcHJpbnRmKHNlcSwgIkFsbG9jYXRlZCBwcml2YXRlIG1lbW9yeSBzaXplIDogJWQga0JcbiIsCgkJICAgc2ItPmN1cnJlbnRfbWVtX3NpemUgPj4gMTApOwoJc2VxX3ByaW50ZihzZXEsICJQcml2YXRlIG1lbW9yeSBiYXNlIGFkZHJlc3MgICA6ICUwIzEweFxuIiwKCQkgICBzYi0+Y3VycmVudF9tZW1fYmFzZSk7CglzZXFfcHJpbnRmKHNlcSwgIkRlc2lyZWQgcHJpdmF0ZSBJL08gc2l6ZSAgICAgIDogJWQga0JcbiIsCgkJICAgc2ItPmRlc2lyZWRfaW9fc2l6ZSA+PiAxMCk7CglzZXFfcHJpbnRmKHNlcSwgIkFsbG9jYXRlZCBwcml2YXRlIEkvTyBzaXplICAgIDogJWQga0JcbiIsCgkJICAgc2ItPmN1cnJlbnRfaW9fc2l6ZSA+PiAxMCk7CglzZXFfcHJpbnRmKHNlcSwgIlByaXZhdGUgSS9PIGJhc2UgYWRkcmVzcyAgICAgIDogJTAjMTB4XG4iLAoJCSAgIHNiLT5jdXJyZW50X2lvX2Jhc2UpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19odyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKCXN0YXRpYyB1MzIgd29yazMyWzVdOwoJc3RhdGljIHU4ICp3b3JrOCA9ICh1OCAqKSB3b3JrMzI7CglzdGF0aWMgdTE2ICp3b3JrMTYgPSAodTE2ICopIHdvcmszMjsKCWludCB0b2tlbjsKCXUzMiBod2NhcDsKCglzdGF0aWMgY2hhciAqY3B1X3RhYmxlW10gPSB7CgkJIkludGVsIDgwOTYwIHNlcmllcyIsCgkJIkFNRDI5MDAgc2VyaWVzIiwKCQkiTW90b3JvbGEgNjgwMDAgc2VyaWVzIiwKCQkiQVJNIHNlcmllcyIsCgkJIk1JUFMgc2VyaWVzIiwKCQkiU3BhcmMgc2VyaWVzIiwKCQkiUG93ZXJQQyBzZXJpZXMiLAoJCSJJbnRlbCB4ODYgc2VyaWVzIgoJfTsKCgl0b2tlbiA9CgkgICAgaTJvX3Bhcm1fZmllbGRfZ2V0KGMtPmV4ZWMsIDB4MDAwMCwgLTEsICZ3b3JrMzIsIHNpemVvZih3b3JrMzIpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4MDAwMCBJT1AgSGFyZHdhcmUiKTsKCQlyZXR1cm4gMDsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIkkyTyBWZW5kb3IgSUQgICAgOiAlMCM2eFxuIiwgd29yazE2WzBdKTsKCXNlcV9wcmludGYoc2VxLCAiUHJvZHVjdCBJRCAgICAgICA6ICUwIzZ4XG4iLCB3b3JrMTZbMV0pOwoJc2VxX3ByaW50ZihzZXEsICJDUFUgICAgICAgICAgICAgIDogIik7CglpZiAod29yazhbMTZdID4gOCkKCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd25cbiIpOwoJZWxzZQoJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIGNwdV90YWJsZVt3b3JrOFsxNl1dKTsKCS8qIEFueW9uZSB1c2luZyBQcm9jZXNzb3JWZXJzaW9uPyAqLwoKCXNlcV9wcmludGYoc2VxLCAiUkFNICAgICAgICAgICAgICA6ICVka0JcbiIsIHdvcmszMlsxXSA+PiAxMCk7CglzZXFfcHJpbnRmKHNlcSwgIk5vbi1Wb2xhdGlsZSBNZW0gOiAlZGtCXG4iLCB3b3JrMzJbMl0gPj4gMTApOwoKCWh3Y2FwID0gd29yazMyWzNdOwoJc2VxX3ByaW50ZihzZXEsICJDYXBhYmlsaXRpZXMgOiAweCUwOHhcbiIsIGh3Y2FwKTsKCXNlcV9wcmludGYoc2VxLCAiICAgWyVzXSBTZWxmIGJvb3RpbmdcbiIsCgkJICAgKGh3Y2FwICYgMHgwMDAwMDAwMSkgPyAiKyIgOiAiLSIpOwoJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFVwZ3JhZGFibGUgSVJUT1NcbiIsCgkJICAgKGh3Y2FwICYgMHgwMDAwMDAwMikgPyAiKyIgOiAiLSIpOwoJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFN1cHBvcnRzIGRvd25sb2FkaW5nIERETXNcbiIsCgkJICAgKGh3Y2FwICYgMHgwMDAwMDAwNCkgPyAiKyIgOiAiLSIpOwoJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFN1cHBvcnRzIGluc3RhbGxpbmcgRERNc1xuIiwKCQkgICAoaHdjYXAgJiAweDAwMDAwMDA4KSA/ICIrIiA6ICItIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgIFslc10gQmF0dGVyeS1iYWNrZWQgUkFNXG4iLAoJCSAgIChod2NhcCAmIDB4MDAwMDAwMTApID8gIisiIDogIi0iKTsKCglyZXR1cm4gMDsKfQoKLyogRXhlY3V0aXZlIGdyb3VwIDAwMDNoIC0gRXhlY3V0aW5nIERETSBMaXN0ICh0YWJsZSkgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZGRtX3RhYmxlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOwoJaW50IHRva2VuOwoJaW50IGk7CgoJdHlwZWRlZiBzdHJ1Y3QgX2kyb19leGVjX2V4ZWN1dGVfZGRtX3RhYmxlIHsKCQl1MTYgZGRtX3RpZDsKCQl1OCBtb2R1bGVfdHlwZTsKCQl1OCByZXNlcnZlZDsKCQl1MTYgaTJvX3ZlbmRvcl9pZDsKCQl1MTYgbW9kdWxlX2lkOwoJCXU4IG1vZHVsZV9uYW1lX3ZlcnNpb25bMjhdOwoJCXUzMiBkYXRhX3NpemU7CgkJdTMyIGNvZGVfc2l6ZTsKCX0gaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGU7CgoJc3RydWN0IHsKCQl1MTYgcmVzdWx0X2NvdW50OwoJCXUxNiBwYWQ7CgkJdTE2IGJsb2NrX3NpemU7CgkJdTggYmxvY2tfc3RhdHVzOwoJCXU4IGVycm9yX2luZm9fc2l6ZTsKCQl1MTYgcm93X2NvdW50OwoJCXUxNiBtb3JlX2ZsYWc7CgkJaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGUgZGRtX3RhYmxlW0kyT19NQVhfTU9EVUxFU107Cgl9ICpyZXN1bHQ7CgoJaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGUgZGRtX3RhYmxlOwoKCXJlc3VsdCA9IGttYWxsb2Moc2l6ZW9mKCpyZXN1bHQpLCBHRlBfS0VSTkVMKTsKCWlmICghcmVzdWx0KQoJCXJldHVybiAtRU5PTUVNOwoKCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGMtPmV4ZWMsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweDAwMDMsIC0xLAoJCQkJICAgTlVMTCwgMCwgcmVzdWx0LCBzaXplb2YoKnJlc3VsdCkpOwoKCWlmICh0b2tlbiA8IDApIHsKCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAoJCQkJCSIweDAwMDMgRXhlY3V0aW5nIERETSBMaXN0Iik7CgkJZ290byBvdXQ7Cgl9CgoJc2VxX3ByaW50ZihzZXEsCgkJICAgIlRpZCAgIE1vZHVsZV90eXBlICAgICBWZW5kb3IgTW9kX2lkICBNb2R1bGVfbmFtZSAgICAgICAgICAgICBWcnMgIERhdGFfc2l6ZSBDb2RlX3NpemVcbiIpOwoJZGRtX3RhYmxlID0gcmVzdWx0LT5kZG1fdGFibGVbMF07CgoJZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+cm93X2NvdW50OyBkZG1fdGFibGUgPSByZXN1bHQtPmRkbV90YWJsZVsrK2ldKSB7CgkJc2VxX3ByaW50ZihzZXEsICIweCUwM3ggIiwgZGRtX3RhYmxlLmRkbV90aWQgJiAweEZGRik7CgoJCXN3aXRjaCAoZGRtX3RhYmxlLm1vZHVsZV90eXBlKSB7CgkJY2FzZSAweDAxOgoJCQlzZXFfcHJpbnRmKHNlcSwgIkRvd25sb2FkZWQgRERNICAiKTsKCQkJYnJlYWs7CgkJY2FzZSAweDIyOgoJCQlzZXFfcHJpbnRmKHNlcSwgIkVtYmVkZGVkIERETSAgICAiKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJc2VxX3ByaW50ZihzZXEsICIgICAgICAgICAgICAgICAgIik7CgkJfQoKCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzd4IiwgZGRtX3RhYmxlLmkyb192ZW5kb3JfaWQpOwoJCXNlcV9wcmludGYoc2VxLCAiJS0jOHgiLCBkZG1fdGFibGUubW9kdWxlX2lkKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjlzIiwKCQkJICAgY2h0b3N0cihkZG1fdGFibGUubW9kdWxlX25hbWVfdmVyc2lvbiwgMjgpKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiU5ZCAgIiwgZGRtX3RhYmxlLmRhdGFfc2l6ZSk7CgkJc2VxX3ByaW50ZihzZXEsICIlOGQiLCBkZG1fdGFibGUuY29kZV9zaXplKTsKCgkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwoJfQogICAgICBvdXQ6CglrZnJlZShyZXN1bHQpOwoJcmV0dXJuIDA7Cn0KCi8qIEV4ZWN1dGl2ZSBncm91cCAwMDA0aCAtIERyaXZlciBTdG9yZSAoc2NhbGFyKSAqLwpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kcml2ZXJfc3RvcmUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7Cgl1MzIgd29yazMyWzhdOwoJaW50IHRva2VuOwoKCXRva2VuID0KCSAgICBpMm9fcGFybV9maWVsZF9nZXQoYy0+ZXhlYywgMHgwMDA0LCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOwoJaWYgKHRva2VuIDwgMCkgewoJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweDAwMDQgRHJpdmVyIFN0b3JlIik7CgkJcmV0dXJuIDA7Cgl9CgoJc2VxX3ByaW50ZihzZXEsICJNb2R1bGUgbGltaXQgIDogJWRcbiIKCQkgICAiTW9kdWxlIGNvdW50ICA6ICVkXG4iCgkJICAgIkN1cnJlbnQgc3BhY2UgOiAlZCBrQlxuIgoJCSAgICJGcmVlIHNwYWNlICAgIDogJWQga0JcbiIsCgkJICAgd29yazMyWzBdLCB3b3JrMzJbMV0sIHdvcmszMlsyXSA+PiAxMCwgd29yazMyWzNdID4+IDEwKTsKCglyZXR1cm4gMDsKfQoKLyogRXhlY3V0aXZlIGdyb3VwIDAwMDVoIC0gRHJpdmVyIFN0b3JlIFRhYmxlICh0YWJsZSkgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZHJpdmVyc19zdG9yZWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXR5cGVkZWYgc3RydWN0IF9pMm9fZHJpdmVyX3N0b3JlIHsKCQl1MTYgc3RvcmVkX2RkbV9pbmRleDsKCQl1OCBtb2R1bGVfdHlwZTsKCQl1OCByZXNlcnZlZDsKCQl1MTYgaTJvX3ZlbmRvcl9pZDsKCQl1MTYgbW9kdWxlX2lkOwoJCXU4IG1vZHVsZV9uYW1lX3ZlcnNpb25bMjhdOwoJCXU4IGRhdGVbOF07CgkJdTMyIG1vZHVsZV9zaXplOwoJCXUzMiBtcGJfc2l6ZTsKCQl1MzIgbW9kdWxlX2ZsYWdzOwoJfSBpMm9fZHJpdmVyX3N0b3JlX3RhYmxlOwoKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7CglpbnQgdG9rZW47CglpbnQgaTsKCgl0eXBlZGVmIHN0cnVjdCB7CgkJdTE2IHJlc3VsdF9jb3VudDsKCQl1MTYgcGFkOwoJCXUxNiBibG9ja19zaXplOwoJCXU4IGJsb2NrX3N0YXR1czsKCQl1OCBlcnJvcl9pbmZvX3NpemU7CgkJdTE2IHJvd19jb3VudDsKCQl1MTYgbW9yZV9mbGFnOwoJCWkyb19kcml2ZXJfc3RvcmVfdGFibGUgZHN0W0kyT19NQVhfTU9EVUxFU107Cgl9IGkyb19kcml2ZXJfcmVzdWx0X3RhYmxlOwoKCWkyb19kcml2ZXJfcmVzdWx0X3RhYmxlICpyZXN1bHQ7CglpMm9fZHJpdmVyX3N0b3JlX3RhYmxlICpkc3Q7CgoJcmVzdWx0ID0ga21hbGxvYyhzaXplb2YoaTJvX2RyaXZlcl9yZXN1bHRfdGFibGUpLCBHRlBfS0VSTkVMKTsKCWlmIChyZXN1bHQgPT0gTlVMTCkKCQlyZXR1cm4gLUVOT01FTTsKCgl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChjLT5leGVjLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHgwMDA1LCAtMSwKCQkJCSAgIE5VTEwsIDAsIHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKCQkJCQkiMHgwMDA1IERSSVZFUiBTVE9SRSBUQUJMRSIpOwoJCWtmcmVlKHJlc3VsdCk7CgkJcmV0dXJuIDA7Cgl9CgoJc2VxX3ByaW50ZihzZXEsCgkJICAgIiMgIE1vZHVsZV90eXBlICAgICBWZW5kb3IgTW9kX2lkICBNb2R1bGVfbmFtZSAgICAgICAgICAgICBWcnMiCgkJICAgIkRhdGUgICAgIE1vZF9zaXplIFBhcl9zaXplIEZsYWdzXG4iKTsKCWZvciAoaSA9IDAsIGRzdCA9ICZyZXN1bHQtPmRzdFswXTsgaSA8IHJlc3VsdC0+cm93X2NvdW50OwoJICAgICBkc3QgPSAmcmVzdWx0LT5kc3RbKytpXSkgewoJCXNlcV9wcmludGYoc2VxLCAiJS0zZCIsIGRzdC0+c3RvcmVkX2RkbV9pbmRleCk7CgkJc3dpdGNoIChkc3QtPm1vZHVsZV90eXBlKSB7CgkJY2FzZSAweDAxOgoJCQlzZXFfcHJpbnRmKHNlcSwgIkRvd25sb2FkZWQgRERNICAiKTsKCQkJYnJlYWs7CgkJY2FzZSAweDIyOgoJCQlzZXFfcHJpbnRmKHNlcSwgIkVtYmVkZGVkIERETSAgICAiKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJc2VxX3ByaW50ZihzZXEsICIgICAgICAgICAgICAgICAgIik7CgkJfQoKCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzd4IiwgZHN0LT5pMm9fdmVuZG9yX2lkKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzh4IiwgZHN0LT5tb2R1bGVfaWQpOwoJCXNlcV9wcmludGYoc2VxLCAiJS0yOXMiLCBjaHRvc3RyKGRzdC0+bW9kdWxlX25hbWVfdmVyc2lvbiwgMjgpKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMiLCBjaHRvc3RyKGRzdC0+ZGF0ZSwgOCkpOwoJCXNlcV9wcmludGYoc2VxLCAiJThkICIsIGRzdC0+bW9kdWxlX3NpemUpOwoJCXNlcV9wcmludGYoc2VxLCAiJThkICIsIGRzdC0+bXBiX3NpemUpOwoJCXNlcV9wcmludGYoc2VxLCAiMHglMDR4IiwgZHN0LT5tb2R1bGVfZmxhZ3MpOwoJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKCX0KCglrZnJlZShyZXN1bHQpOwoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjAwMGggLSBQYXJhbXMgRGVzY3JpcHRvciAodGFibGUpICovCnN0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2dyb3VwcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CglpbnQgdG9rZW47CglpbnQgaTsKCXU4IHByb3BlcnRpZXM7CgoJdHlwZWRlZiBzdHJ1Y3QgX2kyb19ncm91cF9pbmZvIHsKCQl1MTYgZ3JvdXBfbnVtYmVyOwoJCXUxNiBmaWVsZF9jb3VudDsKCQl1MTYgcm93X2NvdW50OwoJCXU4IHByb3BlcnRpZXM7CgkJdTggcmVzZXJ2ZWQ7Cgl9IGkyb19ncm91cF9pbmZvOwoKCXN0cnVjdCB7CgkJdTE2IHJlc3VsdF9jb3VudDsKCQl1MTYgcGFkOwoJCXUxNiBibG9ja19zaXplOwoJCXU4IGJsb2NrX3N0YXR1czsKCQl1OCBlcnJvcl9pbmZvX3NpemU7CgkJdTE2IHJvd19jb3VudDsKCQl1MTYgbW9yZV9mbGFnOwoJCWkyb19ncm91cF9pbmZvIGdyb3VwWzI1Nl07Cgl9ICpyZXN1bHQ7CgoJcmVzdWx0ID0ga21hbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOwoJaWYgKCFyZXN1bHQpCgkJcmV0dXJuIC1FTk9NRU07CgoJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoZCwgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4RjAwMCwgLTEsIE5VTEwsIDAsCgkJCQkgICByZXN1bHQsIHNpemVvZigqcmVzdWx0KSk7CgoJaWYgKHRva2VuIDwgMCkgewoJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweEYwMDAgUGFyYW1zIERlc2NyaXB0b3IiKTsKCQlnb3RvIG91dDsKCX0KCglzZXFfcHJpbnRmKHNlcSwKCQkgICAiIyAgR3JvdXAgICBGaWVsZENvdW50IFJvd0NvdW50IFR5cGUgICBBZGQgRGVsIENsZWFyXG4iKTsKCglmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LT5yb3dfY291bnQ7IGkrKykgewoJCXNlcV9wcmludGYoc2VxLCAiJS0zZCIsIGkpOwoJCXNlcV9wcmludGYoc2VxLCAiMHglMDRYICIsIHJlc3VsdC0+Z3JvdXBbaV0uZ3JvdXBfbnVtYmVyKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiUxMGQgIiwgcmVzdWx0LT5ncm91cFtpXS5maWVsZF9jb3VudCk7CgkJc2VxX3ByaW50ZihzZXEsICIlOGQgIiwgcmVzdWx0LT5ncm91cFtpXS5yb3dfY291bnQpOwoKCQlwcm9wZXJ0aWVzID0gcmVzdWx0LT5ncm91cFtpXS5wcm9wZXJ0aWVzOwoJCWlmIChwcm9wZXJ0aWVzICYgMHgxKQoJCQlzZXFfcHJpbnRmKHNlcSwgIlRhYmxlICAiKTsKCQllbHNlCgkJCXNlcV9wcmludGYoc2VxLCAiU2NhbGFyICIpOwoJCWlmIChwcm9wZXJ0aWVzICYgMHgyKQoJCQlzZXFfcHJpbnRmKHNlcSwgIiArICIpOwoJCWVsc2UKCQkJc2VxX3ByaW50ZihzZXEsICIgLSAiKTsKCQlpZiAocHJvcGVydGllcyAmIDB4NCkKCQkJc2VxX3ByaW50ZihzZXEsICIgICsgIik7CgkJZWxzZQoJCQlzZXFfcHJpbnRmKHNlcSwgIiAgLSAiKTsKCQlpZiAocHJvcGVydGllcyAmIDB4OCkKCQkJc2VxX3ByaW50ZihzZXEsICIgICsgIik7CgkJZWxzZQoJCQlzZXFfcHJpbnRmKHNlcSwgIiAgLSAiKTsKCgkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwoJfQoKCWlmIChyZXN1bHQtPm1vcmVfZmxhZykKCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOwogICAgICBvdXQ6CglrZnJlZShyZXN1bHQpOwoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjAwMWggLSBQaHlzaWNhbCBEZXZpY2UgVGFibGUgKHRhYmxlKSAqLwpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19waHlzX2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CglpbnQgdG9rZW47CglpbnQgaTsKCglzdHJ1Y3QgewoJCXUxNiByZXN1bHRfY291bnQ7CgkJdTE2IHBhZDsKCQl1MTYgYmxvY2tfc2l6ZTsKCQl1OCBibG9ja19zdGF0dXM7CgkJdTggZXJyb3JfaW5mb19zaXplOwoJCXUxNiByb3dfY291bnQ7CgkJdTE2IG1vcmVfZmxhZzsKCQl1MzIgYWRhcHRlcl9pZFs2NF07Cgl9IHJlc3VsdDsKCgl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAxLCAtMSwgTlVMTCwgMCwKCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKCQkJCQkiMHhGMDAxIFBoeXNpY2FsIERldmljZSBUYWJsZSIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChyZXN1bHQucm93X2NvdW50KQoJCXNlcV9wcmludGYoc2VxLCAiIyAgQWRhcHRlcklkXG4iKTsKCglmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LnJvd19jb3VudDsgaSsrKSB7CgkJc2VxX3ByaW50ZihzZXEsICIlLTJkIiwgaSk7CgkJc2VxX3ByaW50ZihzZXEsICIlIzd4XG4iLCByZXN1bHQuYWRhcHRlcl9pZFtpXSk7Cgl9CgoJaWYgKHJlc3VsdC5tb3JlX2ZsYWcpCgkJc2VxX3ByaW50ZihzZXEsICJUaGVyZSBpcyBtb3JlLi4uXG4iKTsKCglyZXR1cm4gMDsKfQoKLyogR2VuZXJpYyBncm91cCBGMDAyaCAtIENsYWltZWQgVGFibGUgKHRhYmxlKSAqLwpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19jbGFpbWVkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKCWludCB0b2tlbjsKCWludCBpOwoKCXN0cnVjdCB7CgkJdTE2IHJlc3VsdF9jb3VudDsKCQl1MTYgcGFkOwoJCXUxNiBibG9ja19zaXplOwoJCXU4IGJsb2NrX3N0YXR1czsKCQl1OCBlcnJvcl9pbmZvX3NpemU7CgkJdTE2IHJvd19jb3VudDsKCQl1MTYgbW9yZV9mbGFnOwoJCXUxNiBjbGFpbWVkX3RpZFs2NF07Cgl9IHJlc3VsdDsKCgl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAyLCAtMSwgTlVMTCwgMCwKCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjAwMiBDbGFpbWVkIFRhYmxlIik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKHJlc3VsdC5yb3dfY291bnQpCgkJc2VxX3ByaW50ZihzZXEsICIjICBDbGFpbWVkVGlkXG4iKTsKCglmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LnJvd19jb3VudDsgaSsrKSB7CgkJc2VxX3ByaW50ZihzZXEsICIlLTJkIiwgaSk7CgkJc2VxX3ByaW50ZihzZXEsICIlIzd4XG4iLCByZXN1bHQuY2xhaW1lZF90aWRbaV0pOwoJfQoKCWlmIChyZXN1bHQubW9yZV9mbGFnKQoJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CgoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjAwM2ggLSBVc2VyIFRhYmxlICh0YWJsZSkgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfdXNlcnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOwoJaW50IHRva2VuOwoJaW50IGk7CgoJdHlwZWRlZiBzdHJ1Y3QgX2kyb191c2VyX3RhYmxlIHsKCQl1MTYgaW5zdGFuY2U7CgkJdTE2IHVzZXJfdGlkOwoJCXU4IGNsYWltX3R5cGU7CgkJdTggcmVzZXJ2ZWQxOwoJCXUxNiByZXNlcnZlZDI7Cgl9IGkyb191c2VyX3RhYmxlOwoKCXN0cnVjdCB7CgkJdTE2IHJlc3VsdF9jb3VudDsKCQl1MTYgcGFkOwoJCXUxNiBibG9ja19zaXplOwoJCXU4IGJsb2NrX3N0YXR1czsKCQl1OCBlcnJvcl9pbmZvX3NpemU7CgkJdTE2IHJvd19jb3VudDsKCQl1MTYgbW9yZV9mbGFnOwoJCWkyb191c2VyX3RhYmxlIHVzZXJbNjRdOwoJfSAqcmVzdWx0OwoKCXJlc3VsdCA9IGttYWxsb2Moc2l6ZW9mKCpyZXN1bHQpLCBHRlBfS0VSTkVMKTsKCWlmICghcmVzdWx0KQoJCXJldHVybiAtRU5PTUVNOwoKCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGQsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweEYwMDMsIC0xLCBOVUxMLCAwLAoJCQkJICAgcmVzdWx0LCBzaXplb2YoKnJlc3VsdCkpOwoKCWlmICh0b2tlbiA8IDApIHsKCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMDAzIFVzZXIgVGFibGUiKTsKCQlnb3RvIG91dDsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIiMgIEluc3RhbmNlIFVzZXJUaWQgQ2xhaW1UeXBlXG4iKTsKCglmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LT5yb3dfY291bnQ7IGkrKykgewoJCXNlcV9wcmludGYoc2VxLCAiJS0zZCIsIGkpOwoJCXNlcV9wcmludGYoc2VxLCAiJSM4eCAiLCByZXN1bHQtPnVzZXJbaV0uaW5zdGFuY2UpOwoJCXNlcV9wcmludGYoc2VxLCAiJSM3eCAiLCByZXN1bHQtPnVzZXJbaV0udXNlcl90aWQpOwoJCXNlcV9wcmludGYoc2VxLCAiJSM5eFxuIiwgcmVzdWx0LT51c2VyW2ldLmNsYWltX3R5cGUpOwoJfQoKCWlmIChyZXN1bHQtPm1vcmVfZmxhZykKCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOwogICAgICBvdXQ6CglrZnJlZShyZXN1bHQpOwoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjAwNWggLSBQcml2YXRlIG1lc3NhZ2UgZXh0ZW5zaW9ucyAodGFibGUpIChvcHRpb25hbCkgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfcHJpdl9tc2dzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKCWludCB0b2tlbjsKCWludCBpOwoKCXR5cGVkZWYgc3RydWN0IF9pMm9fcHJpdmF0ZSB7CgkJdTE2IGV4dF9pbnN0YW5jZTsKCQl1MTYgb3JnYW5pemF0aW9uX2lkOwoJCXUxNiB4X2Z1bmN0aW9uX2NvZGU7Cgl9IGkyb19wcml2YXRlOwoKCXN0cnVjdCB7CgkJdTE2IHJlc3VsdF9jb3VudDsKCQl1MTYgcGFkOwoJCXUxNiBibG9ja19zaXplOwoJCXU4IGJsb2NrX3N0YXR1czsKCQl1OCBlcnJvcl9pbmZvX3NpemU7CgkJdTE2IHJvd19jb3VudDsKCQl1MTYgbW9yZV9mbGFnOwoJCWkyb19wcml2YXRlIGV4dGVuc2lvbls2NF07Cgl9IHJlc3VsdDsKCgl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAwLCAtMSwgTlVMTCwgMCwKCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKCQkJCQkiMHhGMDA1IFByaXZhdGUgTWVzc2FnZSBFeHRlbnNpb25zIChvcHRpb25hbCkiKTsKCQlyZXR1cm4gMDsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIkluc3RhbmNlIyAgT3JnSWQgIEZ1bmN0aW9uQ29kZVxuIik7CgoJZm9yIChpID0gMDsgaSA8IHJlc3VsdC5yb3dfY291bnQ7IGkrKykgewoJCXNlcV9wcmludGYoc2VxLCAiJTAjOXggIiwgcmVzdWx0LmV4dGVuc2lvbltpXS5leHRfaW5zdGFuY2UpOwoJCXNlcV9wcmludGYoc2VxLCAiJTAjNnggIiwgcmVzdWx0LmV4dGVuc2lvbltpXS5vcmdhbml6YXRpb25faWQpOwoJCXNlcV9wcmludGYoc2VxLCAiJTAjNngiLCByZXN1bHQuZXh0ZW5zaW9uW2ldLnhfZnVuY3Rpb25fY29kZSk7CgoJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKCX0KCglpZiAocmVzdWx0Lm1vcmVfZmxhZykKCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOwoKCXJldHVybiAwOwp9CgovKiBHZW5lcmljIGdyb3VwIEYwMDZoIC0gQXV0aG9yaXplZCBVc2VyIFRhYmxlICh0YWJsZSkgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfYXV0aG9yaXplZF91c2VycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CglpbnQgdG9rZW47CglpbnQgaTsKCglzdHJ1Y3QgewoJCXUxNiByZXN1bHRfY291bnQ7CgkJdTE2IHBhZDsKCQl1MTYgYmxvY2tfc2l6ZTsKCQl1OCBibG9ja19zdGF0dXM7CgkJdTggZXJyb3JfaW5mb19zaXplOwoJCXUxNiByb3dfY291bnQ7CgkJdTE2IG1vcmVfZmxhZzsKCQl1MzIgYWx0ZXJuYXRlX3RpZFs2NF07Cgl9IHJlc3VsdDsKCgl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDA2LCAtMSwgTlVMTCwgMCwKCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKCQkJCQkiMHhGMDA2IEF1dG9ob3JpemVkIFVzZXIgVGFibGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAocmVzdWx0LnJvd19jb3VudCkKCQlzZXFfcHJpbnRmKHNlcSwgIiMgIEFsdGVybmF0ZVRpZFxuIik7CgoJZm9yIChpID0gMDsgaSA8IHJlc3VsdC5yb3dfY291bnQ7IGkrKykgewoJCXNlcV9wcmludGYoc2VxLCAiJS0yZCIsIGkpOwoJCXNlcV9wcmludGYoc2VxLCAiJSM3eCAiLCByZXN1bHQuYWx0ZXJuYXRlX3RpZFtpXSk7Cgl9CgoJaWYgKHJlc3VsdC5tb3JlX2ZsYWcpCgkJc2VxX3ByaW50ZihzZXEsICJUaGVyZSBpcyBtb3JlLi4uXG4iKTsKCglyZXR1cm4gMDsKfQoKLyogR2VuZXJpYyBncm91cCBGMTAwaCAtIERldmljZSBJZGVudGl0eSAoc2NhbGFyKSAqLwpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kZXZfaWRlbnRpdHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOwoJc3RhdGljIHUzMiB3b3JrMzJbMTI4XTsJLy8gYWxsb3cgZm9yICJzdHVmZiIgKyB1cCB0byAyNTYgYnl0ZSAobWF4KSBzZXJpYWwgbnVtYmVyCgkvLyA9PSAoYWxsb3cpIDUxMmQgYnl0ZXMgKG1heCkKCXN0YXRpYyB1MTYgKndvcmsxNiA9ICh1MTYgKikgd29yazMyOwoJaW50IHRva2VuOwoKCXRva2VuID0gaTJvX3Bhcm1fZmllbGRfZ2V0KGQsIDB4RjEwMCwgLTEsICZ3b3JrMzIsIHNpemVvZih3b3JrMzIpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjEwMCBEZXZpY2UgSWRlbnRpdHkiKTsKCQlyZXR1cm4gMDsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIkRldmljZSBDbGFzcyAgOiAlc1xuIiwgaTJvX2dldF9jbGFzc19uYW1lKHdvcmsxNlswXSkpOwoJc2VxX3ByaW50ZihzZXEsICJPd25lciBUSUQgICAgIDogJTAjNXhcbiIsIHdvcmsxNlsyXSk7CglzZXFfcHJpbnRmKHNlcSwgIlBhcmVudCBUSUQgICAgOiAlMCM1eFxuIiwgd29yazE2WzNdKTsKCXNlcV9wcmludGYoc2VxLCAiVmVuZG9yIGluZm8gICA6ICVzXG4iLAoJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyAyKSwgMTYpKTsKCXNlcV9wcmludGYoc2VxLCAiUHJvZHVjdCBpbmZvICA6ICVzXG4iLAoJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyA2KSwgMTYpKTsKCXNlcV9wcmludGYoc2VxLCAiRGVzY3JpcHRpb24gICA6ICVzXG4iLAoJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyAxMCksIDE2KSk7CglzZXFfcHJpbnRmKHNlcSwgIlByb2R1Y3QgcmV2LiAgOiAlc1xuIiwKCQkgICBjaHRvc3RyKCh1OCAqKSAod29yazMyICsgMTQpLCA4KSk7CgoJc2VxX3ByaW50ZihzZXEsICJTZXJpYWwgbnVtYmVyIDogIik7CglwcmludF9zZXJpYWxfbnVtYmVyKHNlcSwgKHU4ICopICh3b3JrMzIgKyAxNiksCgkJCSAgICAvKiBhbGxvdyBmb3IgU05MZW4gcGx1cwoJCQkgICAgICogcG9zc2libGUgdHJhaWxpbmcgJ1wwJwoJCQkgICAgICovCgkJCSAgICBzaXplb2Yod29yazMyKSAtICgxNiAqIHNpemVvZih1MzIpKSAtIDIpOwoJc2VxX3ByaW50ZihzZXEsICJcbiIpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kZXZfbmFtZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CgoJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgZC0+ZGV2aWNlLmJ1c19pZCk7CgoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjEwMWggLSBERE0gSWRlbnRpdHkgKHNjYWxhcikgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZGRtX2lkZW50aXR5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKCWludCB0b2tlbjsKCglzdHJ1Y3QgewoJCXUxNiBkZG1fdGlkOwoJCXU4IG1vZHVsZV9uYW1lWzI0XTsKCQl1OCBtb2R1bGVfcmV2WzhdOwoJCXU4IHNuX2Zvcm1hdDsKCQl1OCBzZXJpYWxfbnVtYmVyWzEyXTsKCQl1OCBwYWRbMjU2XTsJLy8gYWxsb3cgdXAgdG8gMjU2IGJ5dGUgKG1heCkgc2VyaWFsIG51bWJlcgoJfSByZXN1bHQ7CgoJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAxLCAtMSwgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOwoKCWlmICh0b2tlbiA8IDApIHsKCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMTAxIERETSBJZGVudGl0eSIpOwoJCXJldHVybiAwOwoJfQoKCXNlcV9wcmludGYoc2VxLCAiUmVnaXN0ZXJpbmcgRERNIFRJRCA6IDB4JTAzeFxuIiwgcmVzdWx0LmRkbV90aWQpOwoJc2VxX3ByaW50ZihzZXEsICJNb2R1bGUgbmFtZSAgICAgICAgIDogJXNcbiIsCgkJICAgY2h0b3N0cihyZXN1bHQubW9kdWxlX25hbWUsIDI0KSk7CglzZXFfcHJpbnRmKHNlcSwgIk1vZHVsZSByZXZpc2lvbiAgICAgOiAlc1xuIiwKCQkgICBjaHRvc3RyKHJlc3VsdC5tb2R1bGVfcmV2LCA4KSk7CgoJc2VxX3ByaW50ZihzZXEsICJTZXJpYWwgbnVtYmVyICAgICAgIDogIik7CglwcmludF9zZXJpYWxfbnVtYmVyKHNlcSwgcmVzdWx0LnNlcmlhbF9udW1iZXIsIHNpemVvZihyZXN1bHQpIC0gMzYpOwoJLyogYWxsb3cgZm9yIFNOTGVuIHBsdXMgcG9zc2libGUgdHJhaWxpbmcgJ1wwJyAqLwoKCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKCglyZXR1cm4gMDsKfQoKLyogR2VuZXJpYyBncm91cCBGMTAyaCAtIFVzZXIgSW5mb3JtYXRpb24gKHNjYWxhcikgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfdWluZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOwoJaW50IHRva2VuOwoKCXN0cnVjdCB7CgkJdTggZGV2aWNlX25hbWVbNjRdOwoJCXU4IHNlcnZpY2VfbmFtZVs2NF07CgkJdTggcGh5c2ljYWxfbG9jYXRpb25bNjRdOwoJCXU4IGluc3RhbmNlX251bWJlcls0XTsKCX0gcmVzdWx0OwoKCXRva2VuID0gaTJvX3Bhcm1fZmllbGRfZ2V0KGQsIDB4RjEwMiwgLTEsICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKCglpZiAodG9rZW4gPCAwKSB7CgkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjEwMiBVc2VyIEluZm9ybWF0aW9uIik7CgkJcmV0dXJuIDA7Cgl9CgoJc2VxX3ByaW50ZihzZXEsICJEZXZpY2UgbmFtZSAgICAgOiAlc1xuIiwKCQkgICBjaHRvc3RyKHJlc3VsdC5kZXZpY2VfbmFtZSwgNjQpKTsKCXNlcV9wcmludGYoc2VxLCAiU2VydmljZSBuYW1lICAgIDogJXNcbiIsCgkJICAgY2h0b3N0cihyZXN1bHQuc2VydmljZV9uYW1lLCA2NCkpOwoJc2VxX3ByaW50ZihzZXEsICJQaHlzaWNhbCBuYW1lICAgOiAlc1xuIiwKCQkgICBjaHRvc3RyKHJlc3VsdC5waHlzaWNhbF9sb2NhdGlvbiwgNjQpKTsKCXNlcV9wcmludGYoc2VxLCAiSW5zdGFuY2UgbnVtYmVyIDogJXNcbiIsCgkJICAgY2h0b3N0cihyZXN1bHQuaW5zdGFuY2VfbnVtYmVyLCA0KSk7CgoJcmV0dXJuIDA7Cn0KCi8qIEdlbmVyaWMgZ3JvdXAgRjEwM2ggLSBTR0wgT3BlcmF0aW5nIExpbWl0cyAoc2NhbGFyKSAqLwpzdGF0aWMgaW50IGkyb19zZXFfc2hvd19zZ2xfbGltaXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKCXN0YXRpYyB1MzIgd29yazMyWzEyXTsKCXN0YXRpYyB1MTYgKndvcmsxNiA9ICh1MTYgKikgd29yazMyOwoJc3RhdGljIHU4ICp3b3JrOCA9ICh1OCAqKSB3b3JrMzI7CglpbnQgdG9rZW47CgoJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAzLCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOwoKCWlmICh0b2tlbiA8IDApIHsKCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAoJCQkJCSIweEYxMDMgU0dMIE9wZXJhdGluZyBMaW1pdHMiKTsKCQlyZXR1cm4gMDsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIlNHTCBjaGFpbiBzaXplICAgICAgICA6ICVkXG4iLCB3b3JrMzJbMF0pOwoJc2VxX3ByaW50ZihzZXEsICJNYXggU0dMIGNoYWluIHNpemUgICAgOiAlZFxuIiwgd29yazMyWzFdKTsKCXNlcV9wcmludGYoc2VxLCAiU0dMIGNoYWluIHNpemUgdGFyZ2V0IDogJWRcbiIsIHdvcmszMlsyXSk7CglzZXFfcHJpbnRmKHNlcSwgIlNHTCBmcmFnIGNvdW50ICAgICAgICA6ICVkXG4iLCB3b3JrMTZbNl0pOwoJc2VxX3ByaW50ZihzZXEsICJNYXggU0dMIGZyYWcgY291bnQgICAgOiAlZFxuIiwgd29yazE2WzddKTsKCXNlcV9wcmludGYoc2VxLCAiU0dMIGZyYWcgY291bnQgdGFyZ2V0IDogJWRcbiIsIHdvcmsxNls4XSk7CgovKiBGSVhNRQoJaWYgKGQtPmkyb3ZlcnNpb24gPT0gMHgwMikKCXsKKi8KCXNlcV9wcmludGYoc2VxLCAiU0dMIGRhdGEgYWxpZ25tZW50ICAgIDogJWRcbiIsIHdvcmsxNls4XSk7CglzZXFfcHJpbnRmKHNlcSwgIlNHTCBhZGRyIGxpbWl0ICAgICAgICA6ICVkXG4iLCB3b3JrOFsyMF0pOwoJc2VxX3ByaW50ZihzZXEsICJTR0wgYWRkciBzaXplcyBzdXBwb3J0ZWQgOiAiKTsKCWlmICh3b3JrOFsyMV0gJiAweDAxKQoJCXNlcV9wcmludGYoc2VxLCAiMzIgYml0ICIpOwoJaWYgKHdvcms4WzIxXSAmIDB4MDIpCgkJc2VxX3ByaW50ZihzZXEsICI2NCBiaXQgIik7CglpZiAod29yazhbMjFdICYgMHgwNCkKCQlzZXFfcHJpbnRmKHNlcSwgIjk2IGJpdCAiKTsKCWlmICh3b3JrOFsyMV0gJiAweDA4KQoJCXNlcV9wcmludGYoc2VxLCAiMTI4IGJpdCAiKTsKCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKLyoKCX0KKi8KCglyZXR1cm4gMDsKfQoKLyogR2VuZXJpYyBncm91cCBGMjAwaCAtIFNlbnNvcnMgKHNjYWxhcikgKi8Kc3RhdGljIGludCBpMm9fc2VxX3Nob3dfc2Vuc29ycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CglpbnQgdG9rZW47CgoJc3RydWN0IHsKCQl1MTYgc2Vuc29yX2luc3RhbmNlOwoJCXU4IGNvbXBvbmVudDsKCQl1MTYgY29tcG9uZW50X2luc3RhbmNlOwoJCXU4IHNlbnNvcl9jbGFzczsKCQl1OCBzZW5zb3JfdHlwZTsKCQl1OCBzY2FsaW5nX2V4cG9uZW50OwoJCXUzMiBhY3R1YWxfcmVhZGluZzsKCQl1MzIgbWluaW11bV9yZWFkaW5nOwoJCXUzMiBsb3cybG93Y2F0X3RyZXNob2xkOwoJCXUzMiBsb3djYXQybG93X3RyZXNob2xkOwoJCXUzMiBsb3d3YXJuMmxvd190cmVzaG9sZDsKCQl1MzIgbG93Mmxvd3dhcm5fdHJlc2hvbGQ7CgkJdTMyIG5vcm0ybG93d2Fybl90cmVzaG9sZDsKCQl1MzIgbG93d2FybjJub3JtX3RyZXNob2xkOwoJCXUzMiBub21pbmFsX3JlYWRpbmc7CgkJdTMyIGhpd2FybjJub3JtX3RyZXNob2xkOwoJCXUzMiBub3JtMmhpd2Fybl90cmVzaG9sZDsKCQl1MzIgaGlnaDJoaXdhcm5fdHJlc2hvbGQ7CgkJdTMyIGhpd2FybjJoaWdoX3RyZXNob2xkOwoJCXUzMiBoaWNhdDJoaWdoX3RyZXNob2xkOwoJCXUzMiBoaTJoaWNhdF90cmVzaG9sZDsKCQl1MzIgbWF4aW11bV9yZWFkaW5nOwoJCXU4IHNlbnNvcl9zdGF0ZTsKCQl1MTYgZXZlbnRfZW5hYmxlOwoJfSByZXN1bHQ7CgoJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMjAwLCAtMSwgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOwoKCWlmICh0b2tlbiA8IDApIHsKCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAoJCQkJCSIweEYyMDAgU2Vuc29ycyAob3B0aW9uYWwpIik7CgkJcmV0dXJuIDA7Cgl9CgoJc2VxX3ByaW50ZihzZXEsICJTZW5zb3IgaW5zdGFuY2UgICAgICAgOiAlZFxuIiwgcmVzdWx0LnNlbnNvcl9pbnN0YW5jZSk7CgoJc2VxX3ByaW50ZihzZXEsICJDb21wb25lbnQgICAgICAgICAgICAgOiAlZCA9ICIsIHJlc3VsdC5jb21wb25lbnQpOwoJc3dpdGNoIChyZXN1bHQuY29tcG9uZW50KSB7CgljYXNlIDA6CgkJc2VxX3ByaW50ZihzZXEsICJPdGhlciIpOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXNlcV9wcmludGYoc2VxLCAiUGxhbmFyIGxvZ2ljIEJvYXJkIik7CgkJYnJlYWs7CgljYXNlIDI6CgkJc2VxX3ByaW50ZihzZXEsICJDUFUiKTsKCQlicmVhazsKCWNhc2UgMzoKCQlzZXFfcHJpbnRmKHNlcSwgIkNoYXNzaXMiKTsKCQlicmVhazsKCWNhc2UgNDoKCQlzZXFfcHJpbnRmKHNlcSwgIlBvd2VyIFN1cHBseSIpOwoJCWJyZWFrOwoJY2FzZSA1OgoJCXNlcV9wcmludGYoc2VxLCAiU3RvcmFnZSIpOwoJCWJyZWFrOwoJY2FzZSA2OgoJCXNlcV9wcmludGYoc2VxLCAiRXh0ZXJuYWwiKTsKCQlicmVhazsKCX0KCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKCglzZXFfcHJpbnRmKHNlcSwgIkNvbXBvbmVudCBpbnN0YW5jZSAgICA6ICVkXG4iLAoJCSAgIHJlc3VsdC5jb21wb25lbnRfaW5zdGFuY2UpOwoJc2VxX3ByaW50ZihzZXEsICJTZW5zb3IgY2xhc3MgICAgICAgICAgOiAlc1xuIiwKCQkgICByZXN1bHQuc2Vuc29yX2NsYXNzID8gIkFuYWxvZyIgOiAiRGlnaXRhbCIpOwoKCXNlcV9wcmludGYoc2VxLCAiU2Vuc29yIHR5cGUgICAgICAgICAgIDogJWQgPSAiLCByZXN1bHQuc2Vuc29yX3R5cGUpOwoJc3dpdGNoIChyZXN1bHQuc2Vuc29yX3R5cGUpIHsKCWNhc2UgMDoKCQlzZXFfcHJpbnRmKHNlcSwgIk90aGVyXG4iKTsKCQlicmVhazsKCWNhc2UgMToKCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJtYWxcbiIpOwoJCWJyZWFrOwoJY2FzZSAyOgoJCXNlcV9wcmludGYoc2VxLCAiREMgdm9sdGFnZSAoREMgdm9sdHMpXG4iKTsKCQlicmVhazsKCWNhc2UgMzoKCQlzZXFfcHJpbnRmKHNlcSwgIkFDIHZvbHRhZ2UgKEFDIHZvbHRzKVxuIik7CgkJYnJlYWs7CgljYXNlIDQ6CgkJc2VxX3ByaW50ZihzZXEsICJEQyBjdXJyZW50IChEQyBhbXBzKVxuIik7CgkJYnJlYWs7CgljYXNlIDU6CgkJc2VxX3ByaW50ZihzZXEsICJBQyBjdXJyZW50IChBQyB2b2x0cylcbiIpOwoJCWJyZWFrOwoJY2FzZSA2OgoJCXNlcV9wcmludGYoc2VxLCAiRG9vciBvcGVuXG4iKTsKCQlicmVhazsKCWNhc2UgNzoKCQlzZXFfcHJpbnRmKHNlcSwgIkZhbiBvcGVyYXRpb25hbFxuIik7CgkJYnJlYWs7Cgl9CgoJc2VxX3ByaW50ZihzZXEsICJTY2FsaW5nIGV4cG9uZW50ICAgICAgOiAlZFxuIiwKCQkgICByZXN1bHQuc2NhbGluZ19leHBvbmVudCk7CglzZXFfcHJpbnRmKHNlcSwgIkFjdHVhbCByZWFkaW5nICAgICAgICA6ICVkXG4iLCByZXN1bHQuYWN0dWFsX3JlYWRpbmcpOwoJc2VxX3ByaW50ZihzZXEsICJNaW5pbXVtIHJlYWRpbmcgICAgICAgOiAlZFxuIiwgcmVzdWx0Lm1pbmltdW1fcmVhZGluZyk7CglzZXFfcHJpbnRmKHNlcSwgIkxvdzJMb3dDYXQgdHJlc2hvbGQgICA6ICVkXG4iLAoJCSAgIHJlc3VsdC5sb3cybG93Y2F0X3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiTG93Q2F0MkxvdyB0cmVzaG9sZCAgIDogJWRcbiIsCgkJICAgcmVzdWx0Lmxvd2NhdDJsb3dfdHJlc2hvbGQpOwoJc2VxX3ByaW50ZihzZXEsICJMb3dXYXJuMkxvdyB0cmVzaG9sZCAgOiAlZFxuIiwKCQkgICByZXN1bHQubG93d2FybjJsb3dfdHJlc2hvbGQpOwoJc2VxX3ByaW50ZihzZXEsICJMb3cyTG93V2FybiB0cmVzaG9sZCAgOiAlZFxuIiwKCQkgICByZXN1bHQubG93Mmxvd3dhcm5fdHJlc2hvbGQpOwoJc2VxX3ByaW50ZihzZXEsICJOb3JtMkxvd1dhcm4gdHJlc2hvbGQgOiAlZFxuIiwKCQkgICByZXN1bHQubm9ybTJsb3d3YXJuX3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiTG93V2FybjJOb3JtIHRyZXNob2xkIDogJWRcbiIsCgkJICAgcmVzdWx0Lmxvd3dhcm4ybm9ybV90cmVzaG9sZCk7CglzZXFfcHJpbnRmKHNlcSwgIk5vbWluYWwgcmVhZGluZyAgICAgICA6ICVkXG4iLCByZXN1bHQubm9taW5hbF9yZWFkaW5nKTsKCXNlcV9wcmludGYoc2VxLCAiSGlXYXJuMk5vcm0gdHJlc2hvbGQgIDogJWRcbiIsCgkJICAgcmVzdWx0Lmhpd2FybjJub3JtX3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiTm9ybTJIaVdhcm4gdHJlc2hvbGQgIDogJWRcbiIsCgkJICAgcmVzdWx0Lm5vcm0yaGl3YXJuX3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiSGlnaDJIaVdhcm4gdHJlc2hvbGQgIDogJWRcbiIsCgkJICAgcmVzdWx0LmhpZ2gyaGl3YXJuX3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiSGlXYXJuMkhpZ2ggdHJlc2hvbGQgIDogJWRcbiIsCgkJICAgcmVzdWx0Lmhpd2FybjJoaWdoX3RyZXNob2xkKTsKCXNlcV9wcmludGYoc2VxLCAiSGlDYXQySGlnaCB0cmVzaG9sZCAgIDogJWRcbiIsCgkJICAgcmVzdWx0LmhpY2F0MmhpZ2hfdHJlc2hvbGQpOwoJc2VxX3ByaW50ZihzZXEsICJIaWdoMkhpQ2F0IHRyZXNob2xkICAgOiAlZFxuIiwKCQkgICByZXN1bHQuaGkyaGljYXRfdHJlc2hvbGQpOwoJc2VxX3ByaW50ZihzZXEsICJNYXhpbXVtIHJlYWRpbmcgICAgICAgOiAlZFxuIiwgcmVzdWx0Lm1heGltdW1fcmVhZGluZyk7CgoJc2VxX3ByaW50ZihzZXEsICJTZW5zb3Igc3RhdGUgICAgICAgICAgOiAlZCA9ICIsIHJlc3VsdC5zZW5zb3Jfc3RhdGUpOwoJc3dpdGNoIChyZXN1bHQuc2Vuc29yX3N0YXRlKSB7CgljYXNlIDA6CgkJc2VxX3ByaW50ZihzZXEsICJOb3JtYWxcbiIpOwoJCWJyZWFrOwoJY2FzZSAxOgoJCXNlcV9wcmludGYoc2VxLCAiQWJub3JtYWxcbiIpOwoJCWJyZWFrOwoJY2FzZSAyOgoJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93blxuIik7CgkJYnJlYWs7CgljYXNlIDM6CgkJc2VxX3ByaW50ZihzZXEsICJMb3cgQ2F0YXN0cm9waGljIChMb0NhdClcbiIpOwoJCWJyZWFrOwoJY2FzZSA0OgoJCXNlcV9wcmludGYoc2VxLCAiTG93IChMb3cpXG4iKTsKCQlicmVhazsKCWNhc2UgNToKCQlzZXFfcHJpbnRmKHNlcSwgIkxvdyBXYXJuaW5nIChMb1dhcm4pXG4iKTsKCQlicmVhazsKCWNhc2UgNjoKCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2ggV2FybmluZyAoSGlXYXJuKVxuIik7CgkJYnJlYWs7CgljYXNlIDc6CgkJc2VxX3ByaW50ZihzZXEsICJIaWdoIChIaWdoKVxuIik7CgkJYnJlYWs7CgljYXNlIDg6CgkJc2VxX3ByaW50ZihzZXEsICJIaWdoIENhdGFzdHJvcGhpYyAoSGlDYXQpXG4iKTsKCQlicmVhazsKCX0KCglzZXFfcHJpbnRmKHNlcSwgIkV2ZW50X2VuYWJsZSA6IDB4JTAyWFxuIiwgcmVzdWx0LmV2ZW50X2VuYWJsZSk7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIE9wZXJhdGlvbmFsIHN0YXRlIGNoYW5nZS4gXG4iLAoJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHgwMSkgPyAiKyIgOiAiLSIpOwoJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBMb3cgY2F0YXN0cm9waGljLiBcbiIsCgkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDAyKSA/ICIrIiA6ICItIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIExvdyByZWFkaW5nLiBcbiIsCgkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDA0KSA/ICIrIiA6ICItIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIExvdyB3YXJuaW5nLiBcbiIsCgkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDA4KSA/ICIrIiA6ICItIik7CglzZXFfcHJpbnRmKHNlcSwKCQkgICAiICAgIFslc10gQ2hhbmdlIGJhY2sgdG8gbm9ybWFsIGZyb20gb3V0IG9mIHJhbmdlIHN0YXRlLiBcbiIsCgkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDEwKSA/ICIrIiA6ICItIik7CglzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIEhpZ2ggd2FybmluZy4gXG4iLAoJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHgyMCkgPyAiKyIgOiAiLSIpOwoJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBIaWdoIHJlYWRpbmcuIFxuIiwKCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4NDApID8gIisiIDogIi0iKTsKCXNlcV9wcmludGYoc2VxLCAiICAgIFslc10gSGlnaCBjYXRhc3Ryb3BoaWMuIFxuIiwKCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4ODApID8gIisiIDogIi0iKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBpMm9fc2VxX29wZW5faHJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2hydCwgUERFKGlub2RlKS0+ZGF0YSk7Cn07CgpzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9sY3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfbGN0LCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3N0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19zdGF0dXMsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5faHcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfaHcsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGRtX3RhYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RkbV90YWJsZSwgUERFKGlub2RlKS0+ZGF0YSk7Cn07CgpzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9kcml2ZXJfc3RvcmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfZHJpdmVyX3N0b3JlLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2RyaXZlcnNfc3RvcmVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RyaXZlcnNfc3RvcmVkLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2dyb3VwcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19ncm91cHMsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fcGh5c19kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfcGh5c19kZXZpY2UsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fY2xhaW1lZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19jbGFpbWVkLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3VzZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3VzZXJzLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3ByaXZfbXNncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19wcml2X21zZ3MsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fYXV0aG9yaXplZF91c2VycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19hdXRob3JpemVkX3VzZXJzLAoJCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2Rldl9pZGVudGl0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19kZXZfaWRlbnRpdHksIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGRtX2lkZW50aXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RkbV9pZGVudGl0eSwgUERFKGlub2RlKS0+ZGF0YSk7Cn07CgpzdGF0aWMgaW50IGkyb19zZXFfb3Blbl91aW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd191aW5mbywgUERFKGlub2RlKS0+ZGF0YSk7Cn07CgpzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9zZ2xfbGltaXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3NnbF9saW1pdHMsIFBERShpbm9kZSktPmRhdGEpOwp9OwoKc3RhdGljIGludCBpMm9fc2VxX29wZW5fc2Vuc29ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19zZW5zb3JzLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2Rldl9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2Rldl9uYW1lLCBQREUoaW5vZGUpLT5kYXRhKTsKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19sY3QgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9sY3QsCgkucmVhZCA9IHNlcV9yZWFkLAoJLmxsc2VlayA9IHNlcV9sc2VlaywKCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfaHJ0ID0gewoJLm9wZW4gPSBpMm9fc2VxX29wZW5faHJ0LAoJLnJlYWQgPSBzZXFfcmVhZCwKCS5sbHNlZWsgPSBzZXFfbHNlZWssCgkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3N0YXR1cyA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX3N0YXR1cywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19odyA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX2h3LAoJLnJlYWQgPSBzZXFfcmVhZCwKCS5sbHNlZWsgPSBzZXFfbHNlZWssCgkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2RkbV90YWJsZSA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX2RkbV90YWJsZSwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kcml2ZXJfc3RvcmUgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9kcml2ZXJfc3RvcmUsCgkucmVhZCA9IHNlcV9yZWFkLAoJLmxsc2VlayA9IHNlcV9sc2VlaywKCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfZHJpdmVyc19zdG9yZWQgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9kcml2ZXJzX3N0b3JlZCwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19ncm91cHMgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9ncm91cHMsCgkucmVhZCA9IHNlcV9yZWFkLAoJLmxsc2VlayA9IHNlcV9sc2VlaywKCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfcGh5c19kZXZpY2UgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9waHlzX2RldmljZSwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19jbGFpbWVkID0gewoJLm9wZW4gPSBpMm9fc2VxX29wZW5fY2xhaW1lZCwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc191c2VycyA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX3VzZXJzLAoJLnJlYWQgPSBzZXFfcmVhZCwKCS5sbHNlZWsgPSBzZXFfbHNlZWssCgkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3ByaXZfbXNncyA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX3ByaXZfbXNncywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19hdXRob3JpemVkX3VzZXJzID0gewoJLm9wZW4gPSBpMm9fc2VxX29wZW5fYXV0aG9yaXplZF91c2VycywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kZXZfbmFtZSA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX2Rldl9uYW1lLAoJLnJlYWQgPSBzZXFfcmVhZCwKCS5sbHNlZWsgPSBzZXFfbHNlZWssCgkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2Rldl9pZGVudGl0eSA9IHsKCS5vcGVuID0gaTJvX3NlcV9vcGVuX2Rldl9pZGVudGl0eSwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kZG1faWRlbnRpdHkgPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl9kZG1faWRlbnRpdHksCgkucmVhZCA9IHNlcV9yZWFkLAoJLmxsc2VlayA9IHNlcV9sc2VlaywKCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfdWluZm8gPSB7Cgkub3BlbiA9IGkyb19zZXFfb3Blbl91aW5mbywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19zZ2xfbGltaXRzID0gewoJLm9wZW4gPSBpMm9fc2VxX29wZW5fc2dsX2xpbWl0cywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19zZW5zb3JzID0gewoJLm9wZW4gPSBpMm9fc2VxX29wZW5fc2Vuc29ycywKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCi8qCiAqIElPUCBzcGVjaWZpYyBlbnRyaWVzLi4ud3JpdGUgZmllbGQganVzdCBpbiBjYXNlIHNvbWVvbmUKICogZXZlciB3YW50cyBvbmUuCiAqLwpzdGF0aWMgaTJvX3Byb2NfZW50cnkgaTJvX3Byb2NfZ2VuZXJpY19pb3BfZW50cmllc1tdID0gewoJeyJocnQiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19ocnR9LAoJeyJsY3QiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19sY3R9LAoJeyJzdGF0dXMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19zdGF0dXN9LAoJeyJodyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2h3fSwKCXsiZGRtX3RhYmxlIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZGRtX3RhYmxlfSwKCXsiZHJpdmVyX3N0b3JlIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZHJpdmVyX3N0b3JlfSwKCXsiZHJpdmVyc19zdG9yZWQiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kcml2ZXJzX3N0b3JlZH0sCgl7TlVMTCwgMCwgTlVMTH0KfTsKCi8qCiAqIERldmljZSBzcGVjaWZpYyBlbnRyaWVzCiAqLwpzdGF0aWMgaTJvX3Byb2NfZW50cnkgZ2VuZXJpY19kZXZfZW50cmllc1tdID0gewoJeyJncm91cHMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19ncm91cHN9LAoJeyJwaHlzX2RldiIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3BoeXNfZGV2aWNlfSwKCXsiY2xhaW1lZCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2NsYWltZWR9LAoJeyJ1c2VycyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3VzZXJzfSwKCXsicHJpdl9tc2dzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfcHJpdl9tc2dzfSwKCXsiYXV0aG9yaXplZF91c2VycyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2F1dGhvcml6ZWRfdXNlcnN9LAoJeyJkZXZfaWRlbnRpdHkiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZXZfaWRlbnRpdHl9LAoJeyJkZG1faWRlbnRpdHkiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZG1faWRlbnRpdHl9LAoJeyJ1c2VyX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc191aW5mb30sCgl7InNnbF9saW1pdHMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19zZ2xfbGltaXRzfSwKCXsic2Vuc29ycyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3NlbnNvcnN9LAoJe05VTEwsIDAsIE5VTEx9Cn07CgovKgogKiAgU3RvcmFnZSB1bml0IHNwZWNpZmljIGVudHJpZXMgKFNDU0kgUGVyaXBoLCBCUykgd2l0aCBkZXZpY2UgbmFtZXMKICovCnN0YXRpYyBpMm9fcHJvY19lbnRyeSByYnNfZGV2X2VudHJpZXNbXSA9IHsKCXsiZGV2X25hbWUiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZXZfbmFtZX0sCgl7TlVMTCwgMCwgTlVMTH0KfTsKCi8qKgogKglpMm9fcHJvY19jcmVhdGVfZW50cmllcyAtIENyZWF0ZXMgcHJvYyBkaXIgZW50cmllcwogKglAZGlyOiBwcm9jIGRpciBlbnRyeSB1bmRlciB3aGljaCB0aGUgZW50cmllcyBzaG91bGQgYmUgcGxhY2VkCiAqCUBpMm9fcGU6IHBvaW50ZXIgdG8gdGhlIGVudHJpZXMgd2hpY2ggc2hvdWxkIGJlIGFkZGVkCiAqCUBkYXRhOiBwb2ludGVyIHRvIEkyTyBjb250cm9sbGVyIG9yIGRldmljZQogKgogKglDcmVhdGUgcHJvYyBkaXIgZW50cmllcyBmb3IgYSBJMk8gY29udHJvbGxlciBvciBJMk8gZGV2aWNlLgogKgogKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAqLwpzdGF0aWMgaW50IGkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAoJCQkJICAgaTJvX3Byb2NfZW50cnkgKiBpMm9fcGUsIHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG1wOwoKCXdoaWxlIChpMm9fcGUtPm5hbWUpIHsKCQl0bXAgPSBjcmVhdGVfcHJvY19lbnRyeShpMm9fcGUtPm5hbWUsIGkyb19wZS0+bW9kZSwgZGlyKTsKCQlpZiAoIXRtcCkKCQkJcmV0dXJuIC0xOwoKCQl0bXAtPmRhdGEgPSBkYXRhOwoJCXRtcC0+cHJvY19mb3BzID0gaTJvX3BlLT5mb3BzOwoKCQlpMm9fcGUrKzsKCX0KCglyZXR1cm4gMDsKfQoKLyoqCiAqCWkyb19wcm9jX3N1YmRpcl9yZW1vdmUgLSBSZW1vdmUgY2hpbGQgZW50cmllcyBmcm9tIGEgcHJvYyBlbnRyeQogKglAZGlyOiBwcm9jIGRpciBlbnRyeSBmcm9tIHdoaWNoIHRoZSBjaGlsZHMgc2hvdWxkIGJlIHJlbW92ZWQKICoKICoJSXRlcmF0ZSBvdmVyIGVhY2ggaTJvIHByb2MgZW50cnkgdW5kZXIgZGlyIGFuZCByZW1vdmUgaXQuIElmIHRoZSBjaGlsZAogKglhbHNvIGhhcyBlbnRyaWVzLCByZW1vdmUgdGhlbSB0b28uCiAqLwpzdGF0aWMgdm9pZCBpMm9fcHJvY19zdWJkaXJfcmVtb3ZlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyKQp7CglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlLCAqdG1wOwoJcGUgPSBkaXItPnN1YmRpcjsKCXdoaWxlIChwZSkgewoJCXRtcCA9IHBlLT5uZXh0OwoJCWkyb19wcm9jX3N1YmRpcl9yZW1vdmUocGUpOwoJCXJlbW92ZV9wcm9jX2VudHJ5KHBlLT5uYW1lLCBkaXIpOwoJCXBlID0gdG1wOwoJfQp9OwoKLyoqCiAqCWkyb19wcm9jX2RldmljZV9hZGQgLSBBZGQgYW4gSTJPIGRldmljZSB0byB0aGUgcHJvYyBkaXIKICoJQGRpcjogcHJvYyBkaXIgZW50cnkgdG8gd2hpY2ggdGhlIGRldmljZSBzaG91bGQgYmUgYWRkZWQKICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgYWRkZWQKICoKICoJQWRkIGFuIEkyTyBkZXZpY2UgdG8gdGhlIHByb2MgZGlyIGVudHJ5IGRpciBhbmQgY3JlYXRlIHRoZSBlbnRyaWVzIGZvcgogKgl0aGUgZGV2aWNlIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIEkyTyBkZXZpY2UuCiAqLwpzdGF0aWMgdm9pZCBpMm9fcHJvY19kZXZpY2VfYWRkKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAoJCQkJc3RydWN0IGkyb19kZXZpY2UgKmRldikKewoJY2hhciBidWZmWzEwXTsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2ZGlyOwoJaTJvX3Byb2NfZW50cnkgKmkyb19wZSA9IE5VTEw7CgoJc3ByaW50ZihidWZmLCAiJTAzeCIsIGRldi0+bGN0X2RhdGEudGlkKTsKCglvc21fZGVidWcoImFkZGluZyBkZXZpY2UgL3Byb2MvaTJvLyVzLyVzXG4iLCBkZXYtPmlvcC0+bmFtZSwgYnVmZik7CgoJZGV2ZGlyID0gcHJvY19ta2RpcihidWZmLCBkaXIpOwoJaWYgKCFkZXZkaXIpIHsKCQlvc21fd2FybigiQ291bGQgbm90IGFsbG9jYXRlIHByb2NkaXIhXG4iKTsKCQlyZXR1cm47Cgl9CgoJZGV2ZGlyLT5kYXRhID0gZGV2OwoKCWkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzKGRldmRpciwgZ2VuZXJpY19kZXZfZW50cmllcywgZGV2KTsKCgkvKiBJbmZvcm0gY29yZSB0aGF0IHdlIHdhbnQgdXBkYXRlcyBhYm91dCB0aGlzIGRldmljZSdzIHN0YXR1cyAqLwoJc3dpdGNoIChkZXYtPmxjdF9kYXRhLmNsYXNzX2lkKSB7CgljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CgljYXNlIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRToKCQlpMm9fcGUgPSByYnNfZGV2X2VudHJpZXM7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoJaWYgKGkyb19wZSkKCQlpMm9fcHJvY19jcmVhdGVfZW50cmllcyhkZXZkaXIsIGkyb19wZSwgZGV2KTsKfQoKLyoqCiAqCWkyb19wcm9jX2lvcF9hZGQgLSBBZGQgYW4gSTJPIGNvbnRyb2xsZXIgdG8gdGhlIGkybyBwcm9jIHRyZWUKICoJQGRpcjogcGFyZW50IHByb2MgZGlyIGVudHJ5CiAqCUBjOiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgYWRkZWQKICoKICoJQWRkIHRoZSBlbnRyaWVzIHRvIHRoZSBwYXJlbnQgcHJvYyBkaXIgZW50cnkuIEFsc28gZWFjaCBkZXZpY2UgaXMgYWRkZWQKICoJdG8gdGhlIGNvbnRyb2xsZXJzIHByb2MgZGlyIGVudHJ5LgogKgogKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAqLwpzdGF0aWMgaW50IGkyb19wcm9jX2lvcF9hZGQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIsCgkJCSAgICBzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCnsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW9wZGlyOwoJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKCglvc21fZGVidWcoImFkZGluZyBJT1AgL3Byb2MvaTJvLyVzXG4iLCBjLT5uYW1lKTsKCglpb3BkaXIgPSBwcm9jX21rZGlyKGMtPm5hbWUsIGRpcik7CglpZiAoIWlvcGRpcikKCQlyZXR1cm4gLTE7CgoJaW9wZGlyLT5kYXRhID0gYzsKCglpMm9fcHJvY19jcmVhdGVfZW50cmllcyhpb3BkaXIsIGkyb19wcm9jX2dlbmVyaWNfaW9wX2VudHJpZXMsIGMpOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKCSAgICBpMm9fcHJvY19kZXZpY2VfYWRkKGlvcGRpciwgZGV2KTsKCglyZXR1cm4gMDsKfQoKLyoqCiAqCWkyb19wcm9jX2lvcF9yZW1vdmUgLSBSZW1vdmVzIGFuIEkyTyBjb250cm9sbGVyIGZyb20gdGhlIGkybyBwcm9jIHRyZWUKICoJQGRpcjogcGFyZW50IHByb2MgZGlyIGVudHJ5CiAqCUBjOiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAogKgogKglJdGVyYXRlIG92ZXIgZWFjaCBpMm8gcHJvYyBlbnRyeSBhbmQgc2VhcmNoIGNvbnRyb2xsZXIgYy4gSWYgaXQgaXMgZm91bmQKICoJcmVtb3ZlIGl0IGZyb20gdGhlIHRyZWUuCiAqLwpzdGF0aWMgdm9pZCBpMm9fcHJvY19pb3BfcmVtb3ZlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAoJCQkJc3RydWN0IGkyb19jb250cm9sbGVyICpjKQp7CglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlLCAqdG1wOwoKCXBlID0gZGlyLT5zdWJkaXI7Cgl3aGlsZSAocGUpIHsKCQl0bXAgPSBwZS0+bmV4dDsKCQlpZiAocGUtPmRhdGEgPT0gYykgewoJCQlpMm9fcHJvY19zdWJkaXJfcmVtb3ZlKHBlKTsKCQkJcmVtb3ZlX3Byb2NfZW50cnkocGUtPm5hbWUsIGRpcik7CgkJfQoJCW9zbV9kZWJ1ZygicmVtb3ZpbmcgSU9QIC9wcm9jL2kyby8lc1xuIiwgYy0+bmFtZSk7CgkJcGUgPSB0bXA7Cgl9Cn0KCi8qKgogKglpMm9fcHJvY19mc19jcmVhdGUgLSBDcmVhdGUgdGhlIGkybyBwcm9jIGZzLgogKgogKglJdGVyYXRlIG92ZXIgZWFjaCBJMk8gY29udHJvbGxlciBhbmQgY3JlYXRlIHRoZSBlbnRyaWVzIGZvciBpdC4KICoKICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKi8Kc3RhdGljIGludCBfX2luaXQgaTJvX3Byb2NfZnNfY3JlYXRlKHZvaWQpCnsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKCglpMm9fcHJvY19kaXJfcm9vdCA9IHByb2NfbWtkaXIoImkybyIsIE5VTEwpOwoJaWYgKCFpMm9fcHJvY19kaXJfcm9vdCkKCQlyZXR1cm4gLTE7CgoJaTJvX3Byb2NfZGlyX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQoJICAgIGkyb19wcm9jX2lvcF9hZGQoaTJvX3Byb2NfZGlyX3Jvb3QsIGMpOwoKCXJldHVybiAwOwp9OwoKLyoqCiAqCWkyb19wcm9jX2ZzX2Rlc3Ryb3kgLSBDbGVhbnVwIHRoZSBhbGwgaTJvIHByb2MgZW50cmllcwogKgogKglJdGVyYXRlIG92ZXIgZWFjaCBJMk8gY29udHJvbGxlciBhbmQgcmVtb3ZlIHRoZSBlbnRyaWVzIGZvciBpdC4KICoKICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKi8Kc3RhdGljIGludCBfX2V4aXQgaTJvX3Byb2NfZnNfZGVzdHJveSh2b2lkKQp7CglzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQoJICAgIGkyb19wcm9jX2lvcF9yZW1vdmUoaTJvX3Byb2NfZGlyX3Jvb3QsIGMpOwoKCXJlbW92ZV9wcm9jX2VudHJ5KCJpMm8iLCBOVUxMKTsKCglyZXR1cm4gMDsKfTsKCi8qKgogKglpMm9fcHJvY19pbml0IC0gSW5pdCBmdW5jdGlvbiBmb3IgcHJvY2ZzCiAqCiAqCVJlZ2lzdGVycyBQcm9jIE9TTSBhbmQgY3JlYXRlcyBwcm9jZnMgZW50cmllcy4KICoKICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKi8Kc3RhdGljIGludCBfX2luaXQgaTJvX3Byb2NfaW5pdCh2b2lkKQp7CglpbnQgcmM7CgoJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKCglyYyA9IGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19wcm9jX2RyaXZlcik7CglpZiAocmMpCgkJcmV0dXJuIHJjOwoKCXJjID0gaTJvX3Byb2NfZnNfY3JlYXRlKCk7CglpZiAocmMpIHsKCQlpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19wcm9jX2RyaXZlcik7CgkJcmV0dXJuIHJjOwoJfQoKCXJldHVybiAwOwp9OwoKLyoqCiAqCWkyb19wcm9jX2V4aXQgLSBFeGl0IGZ1bmN0aW9uIGZvciBwcm9jZnMKICoKICoJVW5yZWdpc3RlcnMgUHJvYyBPU00gYW5kIHJlbW92ZXMgcHJvY2ZzIGVudHJpZXMuCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgaTJvX3Byb2NfZXhpdCh2b2lkKQp7CglpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19wcm9jX2RyaXZlcik7CglpMm9fcHJvY19mc19kZXN0cm95KCk7Cn07CgpNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2F4ZW5hIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7Ck1PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKCm1vZHVsZV9pbml0KGkyb19wcm9jX2luaXQpOwptb2R1bGVfZXhpdChpMm9fcHJvY19leGl0KTsK