LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICogCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGNvbW0pOwoKLyogd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIENPTU1fTVNSX09GRlNFVCAgMzUKI2RlZmluZSBNU1JfQ1RTICAweDEwCiNkZWZpbmUgTVNSX0RTUiAgMHgyMAojZGVmaW5lIE1TUl9SSSAgIDB4NDAKI2RlZmluZSBNU1JfUkxTRCAweDgwCiNkZWZpbmUgTVNSX01BU0sgKE1TUl9DVFN8TVNSX0RTUnxNU1JfUkl8TVNSX1JMU0QpCgojZGVmaW5lIEZMQUdfTFBUIDB4ODAKCiNkZWZpbmUgTUFYX1BPUlRTICAgOQoKc3RydWN0IERvc0RldmljZVN0cnVjdCB7CiAgICBjaGFyICpkZXZpY2VuYW1lOyAgIC8qIC9kZXYvdHR5UzAgKi8KICAgIEhBTkRMRSBoYW5kbGU7CiAgICBpbnQgc3VzcGVuZGVkOwogICAgaW50IHVuZ2V0LHhtaXQ7CiAgICBpbnQgYmF1ZHJhdGU7CiAgICBpbnQgZXZ0Y2hhcjsKICAgIC8qIGV2ZW50cyAqLwogICAgaW50IGNvbW1lcnJvciwgZXZlbnRtYXNrOwogICAgLyogYnVmZmVycyAqLwogICAgY2hhciAqaW5idWYsKm91dGJ1ZjsKICAgIHVuc2lnbmVkIGlidWZfc2l6ZSxpYnVmX2hlYWQsaWJ1Zl90YWlsOwogICAgdW5zaWduZWQgb2J1Zl9zaXplLG9idWZfaGVhZCxvYnVmX3RhaWw7CiAgICAvKiBub3RpZmljYXRpb25zICovCiAgICBIV05EIHduZDsKICAgIGludCBuX3JlYWQsIG5fd3JpdGU7CiAgICBPVkVSTEFQUEVEIHJlYWRfb3YsIHdyaXRlX292OwogICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZXMgKi8KICAgIERDQjE2IGRjYjsKICAgIC8qIHBvaW50ZXIgdG8gdW5rbm93big9PXVuZG9jdW1lbnRlZCkgY29tbSBzdHJ1Y3R1cmUgKi8KICAgIFNFR1BUUiBzZWdfdW5rbm93bjsKICAgIEJZVEUgdW5rbm93bls0MF07Cn07CgpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCBDT01bTUFYX1BPUlRTXTsKc3RhdGljIHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgTFBUW01BWF9QT1JUU107CgovKiB1cGRhdGUgd2luZG93J3Mgc2VtaSBkb2N1bWVudGVkIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLwovKiBzZWUga25vd2xlZGdlIGJhc2UgUTEwMTQxNyAqLwpzdGF0aWMgdm9pZCBDT01NX01TUlVwZGF0ZSggSEFORExFIGhhbmRsZSwgVUNIQVIgKiBwTXNyICkKewogICAgVUNIQVIgdG1wbXNyPTA7CiAgICBEV09SRCBtc3RhdD0wOwoKICAgIGlmKCFHZXRDb21tTW9kZW1TdGF0dXMoaGFuZGxlLCZtc3RhdCkpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmKG1zdGF0ICYgTVNfQ1RTX09OKSB0bXBtc3IgfD0gTVNSX0NUUzsKICAgIGlmKG1zdGF0ICYgTVNfRFNSX09OKSB0bXBtc3IgfD0gTVNSX0RTUjsKICAgIGlmKG1zdGF0ICYgTVNfUklOR19PTikgdG1wbXNyIHw9IE1TUl9SSTsKICAgIGlmKG1zdGF0ICYgTVNfUkxTRF9PTikgdG1wbXNyIHw9IE1TUl9STFNEOwogICAgKnBNc3IgPSAoKnBNc3IgJiB+TVNSX01BU0spIHwgdG1wbXNyOwp9Cgp2b2lkIENPTU1fSW5pdCh2b2lkKQp7CglpbnQgeDsKCWNoYXIgb3B0aW9uWzEwXSwgdGVtcFsyNTZdLCAqYnRlbXA7CglIS0VZIGhrZXk7CgoJZm9yICh4PTA7IHghPU1BWF9QT1JUUzsgeCsrKSB7CgkJc3RyY3B5KG9wdGlvbiwiQ09NeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJLyogZGVmYXVsdCB2YWx1ZSAqLwoJCXN0cmNweSh0ZW1wLCAiKiIpOwoKCQlpZighUmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFdpbmVcXFdpbmVcXENvbmZpZ1xcc2VyaWFscG9ydHMiLCAmaGtleSkpCgkJewoJCSAgICBEV09SRCB0eXBlLCBjb3VudCA9IHNpemVvZih0ZW1wKTsKCgkJICAgIFJlZ1F1ZXJ5VmFsdWVFeEEoaGtleSwgb3B0aW9uLCAwLCAmdHlwZSwgdGVtcCwgJmNvdW50KTsKCQkgICAgUmVnQ2xvc2VLZXkoaGtleSk7CgkJfQoKCQlpZiAoIXN0cmNtcCh0ZW1wLCAiKiIpIHx8ICp0ZW1wID09ICdcMCcpIAoJCQlDT01beF0uZGV2aWNlbmFtZSA9IE5VTEw7CgkJZWxzZSB7CgkJICAJYnRlbXAgPSBzdHJjaHIodGVtcCwnLCcpOwoJCQlpZiAoYnRlbXAgIT0gTlVMTCkgewoJCQkgIAkqYnRlbXArKyA9ICdcMCc7CgkJCQlDT01beF0uYmF1ZHJhdGUgPSBhdG9pKGJ0ZW1wKTsKCQkJfSBlbHNlIHsKCQkJCUNPTVt4XS5iYXVkcmF0ZSA9IC0xOwoJCQl9CgkJCWlmICgoQ09NW3hdLmRldmljZW5hbWUgPSBtYWxsb2Moc3RybGVuKHRlbXApKzEpKSA9PSBOVUxMKSAKCQkJCVdBUk4oIkNhbid0IG1hbGxvYyBmb3IgZGV2aWNlIGluZm8hXG4iKTsKCQkJZWxzZSB7CgkJCQlDT01beF0uaGFuZGxlID0gMDsKCQkJCXN0cmNweShDT01beF0uZGV2aWNlbmFtZSwgdGVtcCk7CgkJCQlUUkFDRSgiJXMgPSAlc1xuIiwgb3B0aW9uLCBDT01beF0uZGV2aWNlbmFtZSk7CgkJCX0KIAkJfQoKCQlzdHJjcHkob3B0aW9uLCAiTFBUeCIpOwoJCW9wdGlvblszXSA9ICcxJyArIHg7CgkJb3B0aW9uWzRdID0gJ1wwJzsKCgkJLyogZGVmYXVsdCB2YWx1ZSAqLwoJCXN0cmNweSh0ZW1wLCAiKiIpOwoKCQlpZighUmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFdpbmVcXFdpbmVcXENvbmZpZ1xccGFyYWxsZWxwb3J0cyIsICZoa2V5KSkKCQl7CgkJICAgIERXT1JEIHR5cGUsIGNvdW50ID0gc2l6ZW9mKHRlbXApOwoKCQkgICAgUmVnUXVlcnlWYWx1ZUV4QShoa2V5LCBvcHRpb24sIDAsICZ0eXBlLCB0ZW1wLCAmY291bnQpOwoJCSAgICBSZWdDbG9zZUtleShoa2V5KTsKCQl9CgoJCWlmICghc3RyY21wKHRlbXAsICIqIikgfHwgKnRlbXAgPT0gJ1wwJykKCQkJTFBUW3hdLmRldmljZW5hbWUgPSBOVUxMOwoJCWVsc2UgewoJCQlpZiAoKExQVFt4XS5kZXZpY2VuYW1lID0gbWFsbG9jKHN0cmxlbih0ZW1wKSsxKSkgPT0gTlVMTCkgCgkJCQlXQVJOKCJDYW4ndCBtYWxsb2MgZm9yIGRldmljZSBpbmZvIVxuIik7CgkJCWVsc2UgewoJCQkJTFBUW3hdLmhhbmRsZSA9IDA7CgkJCQlzdHJjcHkoTFBUW3hdLmRldmljZW5hbWUsIHRlbXApOwoJCQkJVFJBQ0UoIiVzID0gJXNcbiIsIG9wdGlvbiwgTFBUW3hdLmRldmljZW5hbWUpOwoJCQl9CgkJfQoKCX0KfQoKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGluZGV4KQp7CglpZiAoKGluZGV4JjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoaW5kZXgmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtpbmRleF0uaGFuZGxlKQoJCSAgICByZXR1cm4gJkNPTVtpbmRleF07CgkgICAgfSBlbHNlIHsKCQlpbmRleCAmPSAweDdmOwoJCWlmIChMUFRbaW5kZXhdLmhhbmRsZSkKCQkgICAgcmV0dXJuICZMUFRbaW5kZXhdOwoJICAgIH0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCAgICBHZXRDb21tUG9ydF9vdihMUE9WRVJMQVBQRUQgb3YsIGludCB3cml0ZSkKewoJaW50IHg7CiAgICAgICAgCglmb3IgKHg9MDsgeDxNQVhfUE9SVFM7IHgrKykgewoJCWlmIChvdiA9PSAod3JpdGU/JkNPTVt4XS53cml0ZV9vdjomQ09NW3hdLnJlYWRfb3YpKQoJCQlyZXR1cm4geDsKCX0KICAgICAgIAoJcmV0dXJuIC0xOwp9IAoKc3RhdGljIGludCBWYWxpZENPTVBvcnQoaW50IHgpCnsKCXJldHVybih4IDwgTUFYX1BPUlRTID8gKGludCkgQ09NW3hdLmRldmljZW5hbWUgOiAwKTsgCn0KCnN0YXRpYyBpbnQgVmFsaWRMUFRQb3J0KGludCB4KQp7CglyZXR1cm4oeCA8IE1BWF9QT1JUUyA/IChpbnQpIExQVFt4XS5kZXZpY2VuYW1lIDogMCk7IAp9CgpzdGF0aWMgaW50IFdpbkVycm9yKHZvaWQpCnsKICAgICAgICBUUkFDRSgiZXJybm8gPSAlZFxuIiwgZXJybm8pOwoJc3dpdGNoIChlcnJubykgewoJCWRlZmF1bHQ6CgkJCXJldHVybiBDRV9JT0U7CgkJfQp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9pbmJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IHB0ci0+aWJ1Zl9zaXplIDogMCkKICAgICsgcHRyLT5pYnVmX2hlYWQgLSBwdHItPmlidWZfdGFpbDsKfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1fb3V0YnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8gcHRyLT5vYnVmX3NpemUgOiAwKQogICAgKyBwdHItPm9idWZfaGVhZCAtIHB0ci0+b2J1Zl90YWlsOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CgpzdGF0aWMgVk9JRCBXSU5BUEkgQ09NTTE2X1JlYWRDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiA7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDApOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiB3ZSBnZXQgY2FuY2VsbGVkIHdoZW4gQ2xvc2VDb21tIGlzIGNhbGxlZCAqLwoJaWYgKHN0YXR1cz09U1RBVFVTX0NBTkNFTExFRCkKCXsKCQlUUkFDRSgiQ2FuY2VsbGVkXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogcmVhZCBkYXRhIGZyb20gY29tbSBwb3J0ICovCglpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CgkJRVJSKCJhc3luYyByZWFkIGZhaWxlZCAlMDhseFxuIixzdGF0dXMpOwoJCUNPTVtjaWRdLmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCQlyZXR1cm47Cgl9CglUUkFDRSgiYXN5bmMgcmVhZCBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJcHJldiA9IGNvbW1faW5idWYocHRyKTsKCgkvKiBjaGVjayBmb3IgZXZlbnRzICovCglpZiAoKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhGTEFHKSAmJgoJICAgIG1lbWNocihwdHItPmluYnVmICsgcHRyLT5pYnVmX2hlYWQsIHB0ci0+ZXZ0Y2hhciwgbGVuKSkgewoJCSooV09SRCopKENPTVtjaWRdLnVua25vd24pIHw9IEVWX1JYRkxBRzsKCQltYXNrIHw9IENOX0VWRU5UOwoJfQoJaWYgKHB0ci0+ZXZlbnRtYXNrICYgRVZfUlhDSEFSKSB7CgkJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgfD0gRVZfUlhDSEFSOwoJCW1hc2sgfD0gQ05fRVZFTlQ7Cgl9CgoJLyogYWR2YW5jZSBidWZmZXIgcG9zaXRpb24gKi8KCXB0ci0+aWJ1Zl9oZWFkICs9IGxlbjsKCWlmIChwdHItPmlidWZfaGVhZCA+PSBwdHItPmlidWZfc2l6ZSkKCQlwdHItPmlidWZfaGVhZCA9IDA7CgoJLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwoJaWYgKHB0ci0+d25kICYmIChwdHItPm5fcmVhZD4wKSAmJiAocHJldjxwdHItPm5fcmVhZCkgJiYKCSAgICAoY29tbV9pbmJ1ZihwdHIpPj1wdHItPm5fcmVhZCkpIHsKCQkvKiBwYXNzZWQgdGhlIHJlY2VpdmUgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwoJCW1hc2sgfD0gQ05fUkVDRUlWRTsKCX0KCgkvKiBzZW5kIG5vdGlmaWNhdGlvbnMsIGlmIGFueSAqLwoJaWYgKHB0ci0+d25kICYmIG1hc2spIHsKCQlUUkFDRSgibm90aWZ5aW5nICUwNHg6IGNpZD0lZCwgbWFzaz0lMDJ4XG4iLCBwdHItPnduZCwgY2lkLCBtYXNrKTsKCQlQb3N0TWVzc2FnZUEocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7Cgl9CgoJLyogb24gcmVhbCB3aW5kb3dzLCB0aGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zLCBzaW5jZSBpdCBpcyByZWN1cnNpdmUgKi8KCS8qIHJlc3RhcnQgdGhlIHJlY2VpdmUgKi8KCWNvbW1fd2FpdHJlYWQocHRyKTsKfQoKLyogdGhpcyBpcyBtZWFudCB0byB3b3JrIGxpa2Ugd3JpdGUoKSAqLwpzdGF0aWMgSU5UIENPTU0xNl9Xcml0ZUZpbGUoSEFORExFIGhDb21tLCBMUENWT0lEIGJ1ZmZlciwgRFdPUkQgbGVuKQp7CglPVkVSTEFQUEVEIG92OwoJRFdPUkQgY291bnQ9IC0xOwoKCVplcm9NZW1vcnkoJm92LHNpemVvZiBvdik7Cglvdi5oRXZlbnQgPSBDcmVhdGVFdmVudEEoTlVMTCwwLDAsTlVMTCk7CglpZihvdi5oRXZlbnQ9PUlOVkFMSURfSEFORExFX1ZBTFVFKQoJCXJldHVybiAtMTsKCglpZighV3JpdGVGaWxlKGhDb21tLGJ1ZmZlcixsZW4sJmNvdW50LCZvdikpCgl7CgkJaWYoR2V0TGFzdEVycm9yKCk9PUVSUk9SX0lPX1BFTkRJTkcpCgkJewoJCQlHZXRPdmVybGFwcGVkUmVzdWx0KGhDb21tLCZvdiwmY291bnQsVFJVRSk7CgkJfQoJfQoJQ2xvc2VIYW5kbGUob3YuaEV2ZW50KTsKCglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBWT0lEIFdJTkFQSSBDT01NMTZfV3JpdGVDb21wbGV0ZShEV09SRCBzdGF0dXMsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiwgYmxlZnQ7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDEpOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKCQlFUlIoImFzeW5jIHdyaXRlIGZhaWxlZFxuIik7CgkJQ09NW2NpZF0uY29tbWVycm9yID0gQ0VfUlhPVkVSOwoJCXJldHVybjsKCX0KCVRSQUNFKCJhc3luYyB3cml0ZSBjb21wbGV0ZWQgJWxkIGJ5dGVzXG4iLGxlbik7CgoJLyogdXBkYXRlIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KCXByZXYgPSBjb21tX291dGJ1ZigmQ09NW2NpZF0pOwoJcHRyLT5vYnVmX3RhaWwgKz0gbGVuOwoJaWYgKHB0ci0+b2J1Zl90YWlsID49IHB0ci0+b2J1Zl9zaXplKQoJCXB0ci0+b2J1Zl90YWlsID0gMDsKCgkvKiB3cml0ZSBhbnkgVHJhbnNtaXRDb21tQ2hhciBjaGFyYWN0ZXIgKi8KCWlmIChwdHItPnhtaXQ+PTApIHsKCQlsZW4gPSBDT01NMTZfV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCAmKHB0ci0+eG1pdCksIDEpOwoJCWlmIChsZW4gPiAwKSBwdHItPnhtaXQgPSAtMTsKCX0KCgkvKiB3cml0ZSBmcm9tIG91dHB1dCBxdWV1ZSAqLwoJYmxlZnQgPSAoKHB0ci0+b2J1Zl90YWlsIDw9IHB0ci0+b2J1Zl9oZWFkKSA/IAoJCXB0ci0+b2J1Zl9oZWFkIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX3RhaWw7CgoJLyogY2hlY2sgZm9yIG5vdGlmaWNhdGlvbiAqLwoJaWYgKHB0ci0+d25kICYmIChwdHItPm5fd3JpdGU+MCkgJiYgKHByZXY+PXB0ci0+bl93cml0ZSkgJiYKCSAgKGNvbW1fb3V0YnVmKHB0cik8cHRyLT5uX3dyaXRlKSkgewoJCS8qIHBhc3NlZCB0aGUgdHJhbnNtaXQgbm90aWZpY2F0aW9uIHRocmVzaG9sZCAqLwoJCW1hc2sgfD0gQ05fVFJBTlNNSVQ7Cgl9CgoJLyogc2VuZCBub3RpZmljYXRpb25zLCBpZiBhbnkgKi8KCWlmIChwdHItPnduZCAmJiBtYXNrKSB7CgkJVFJBQ0UoIm5vdGlmeWluZyAlMDR4OiBjaWQ9JWQsIG1hc2s9JTAyeFxuIiwgcHRyLT53bmQsIGNpZCwgbWFzayk7CgkJUG9zdE1lc3NhZ2VBKHB0ci0+d25kLCBXTV9DT01NTk9USUZZLCBjaWQsIG1hc2spOwoJfQoKCS8qIHN0YXJ0IGFnYWluIGlmIG5lY2Vzc2FyeSAqLwoJaWYoYmxlZnQpCgkJY29tbV93YWl0d3JpdGUocHRyKTsKfQoKc3RhdGljIHZvaWQgY29tbV93YWl0cmVhZChzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKCWludCBibGVmdDsKICAgICAgICBDT01TVEFUIHN0YXQ7CgoJLyogRklYTUU6IGdldCB0aW1lb3V0cyB3b3JraW5nIHByb3Blcmx5IHNvIHdlIGNhbiByZWFkIGJsZWZ0IGJ5dGVzICovCglibGVmdCA9ICgocHRyLT5pYnVmX3RhaWwgPiBwdHItPmlidWZfaGVhZCkgPyAKCQkocHRyLT5pYnVmX3RhaWwtMSkgOiBwdHItPmlidWZfc2l6ZSkgLSBwdHItPmlidWZfaGVhZDsKCgkvKiBmaW5kIG91dCBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgYnVmZmVyICovCglpZihDbGVhckNvbW1FcnJvcihwdHItPmhhbmRsZSxOVUxMLCZzdGF0KSkKCQlibGVmdCA9IChibGVmdDxzdGF0LmNiSW5RdWUpID8gYmxlZnQgOiBzdGF0LmNiSW5RdWU7CgllbHNlCgkJYmxlZnQgPSAxOwoKCS8qIGFsd2F5cyByZWFkIGF0IGxlYXN0IG9uZSBieXRlICovCglpZihibGVmdD09MCkKCQlibGVmdCsrOwoKCVJlYWRGaWxlRXgocHRyLT5oYW5kbGUsCgkJcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLAoJCWJsZWZ0LAoJCSZwdHItPnJlYWRfb3YsCgkJQ09NTTE2X1JlYWRDb21wbGV0ZSk7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewoJaW50IGJsZWZ0OwoKCWJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPyAKCQlwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl90YWlsOwoJV3JpdGVGaWxlRXgocHRyLT5oYW5kbGUsCgkJcHRyLT5vdXRidWYgKyBwdHItPm9idWZfdGFpbCwKCQlibGVmdCwKCQkmcHRyLT53cml0ZV9vdiwKCQlDT01NMTZfV3JpdGVDb21wbGV0ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDT01NMTZfRENCdG9EQ0IxNgkoSW50ZXJuYWwpCiAqLwpJTlQxNiBDT01NMTZfRENCdG9EQ0IxNihMUERDQiBscGRjYiwgTFBEQ0IxNiBscGRjYjE2KQp7CglpZihscGRjYi0+QmF1ZFJhdGU8MHgxMDAwMCkKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IGxwZGNiLT5CYXVkUmF0ZTsKCWVsc2UgaWYobHBkY2ItPkJhdWRSYXRlPT0xMTUyMDApCgkJCWxwZGNiMTYtPkJhdWRSYXRlID0gNTc2MDE7CgllbHNlIHsKCQlXQVJOKCJCYXVkIHJhdGUgY2FuJ3QgYmUgY29udmVydGVkXG4iKTsKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IDU3NjAxOwoJfQoJbHBkY2IxNi0+Qnl0ZVNpemUgPSBscGRjYi0+Qnl0ZVNpemU7CglscGRjYjE2LT5mUGFyaXR5ID0gbHBkY2ItPmZQYXJpdHk7CglscGRjYjE2LT5QYXJpdHkgPSBscGRjYi0+UGFyaXR5OwoJbHBkY2IxNi0+U3RvcEJpdHMgPSBscGRjYi0+U3RvcEJpdHM7CgoJbHBkY2IxNi0+UmxzVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Q3RzVGltZW91dCA9IDUwOyAKCWxwZGNiMTYtPkRzclRpbWVvdXQgPSA1MDsKCWxwZGNiMTYtPmZOdWxsID0gMDsKCWxwZGNiMTYtPmZDaEV2dCA9IDA7CglscGRjYjE2LT5mQmluYXJ5ID0gMTsKCglscGRjYjE2LT5mRHRyZmxvdyA9IChscGRjYi0+ZkR0ckNvbnRyb2w9PURUUl9DT05UUk9MX0hBTkRTSEFLRSk7CglscGRjYjE2LT5mUnRzZmxvdyA9IChscGRjYi0+ZlJ0c0NvbnRyb2w9PVJUU19DT05UUk9MX0hBTkRTSEFLRSk7CglscGRjYjE2LT5mT3V0eEN0c0Zsb3cgPSBscGRjYi0+Zk91dHhDdHNGbG93OwoJbHBkY2IxNi0+Zk91dHhEc3JGbG93ID0gbHBkY2ItPmZPdXR4RHNyRmxvdzsKCWxwZGNiMTYtPmZEdHJEaXNhYmxlID0gKGxwZGNiLT5mRHRyQ29udHJvbD09RFRSX0NPTlRST0xfRElTQUJMRSk7CgoJbHBkY2IxNi0+ZkluWCA9IGxwZGNiLT5mSW5YOwoKCWxwZGNiMTYtPmZPdXRYID0gbHBkY2ItPmZPdXRYOwovKgoJbHBkY2IxNi0+WG9uQ2hhciA9IAoJbHBkY2IxNi0+WG9mZkNoYXIgPSAKICovCglscGRjYjE2LT5Yb25MaW0gPSAxMDsKCWxwZGNiMTYtPlhvZmZMaW0gPSAxMDsKCglyZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQgkJKFVTRVIuMjEzKQogKgogKiBBY2NvcmRpbmcgdG8gdGhlIEVDTUEtMjM0ICgzNjguMykgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFIG9uIAogKiBzdWNjZXNzLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gLTEuIAogKi8KSU5UMTYgV0lOQVBJIEJ1aWxkQ29tbURDQjE2KExQQ1NUUiBkZXZpY2UsIExQRENCMTYgbHBkY2IpCnsKCS8qICJDT00xOjk2LG4sOCwxIgkqLwoJLyogIDAxMjM0NQkJKi8KCWludCBwb3J0OwoJRENCIGRjYjsKCglUUkFDRSgiKCVzKSwgcHRyICVwXG4iLCBkZXZpY2UsIGxwZGNiKTsKCglpZiAoc3RybmNhc2VjbXAoZGV2aWNlLCJDT00iLDMpKQoJCXJldHVybiAtMTsKCXBvcnQgPSBkZXZpY2VbM10gLSAnMCc7CgoJaWYgKHBvcnQtLSA9PSAwKSB7CgkJRVJSKCJCVUcgISBDT00wIGNhbid0IGV4aXN0IVxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICghVmFsaWRDT01Qb3J0KHBvcnQpKSB7CgkJRklYTUUoImludmFsaWQgQ09NIHBvcnQgJWQ/XG4iLHBvcnQpOwoJCXJldHVybiAtMTsKCX0KCQkKCW1lbXNldChscGRjYiwgMCwgc2l6ZW9mKERDQjE2KSk7IC8qIGluaXRpYWxpemUgKi8KCglscGRjYi0+SWQgPSBwb3J0OwoJZGNiLkRDQmxlbmd0aCA9IHNpemVvZihEQ0IpOwoKCWlmIChzdHJjaHIoZGV2aWNlLCc9JykpIC8qIGJsb2NrIG5ldyBzdHlsZSAqLwoJCXJldHVybiAtMTsKCglpZighQnVpbGRDb21tRENCQShkZXZpY2UsJmRjYikpCgkJcmV0dXJuIC0xOwoKCXJldHVybiBDT01NMTZfRENCdG9EQ0IxNigmZGNiLCBscGRjYik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglPcGVuQ29tbQkJKFVTRVIuMjAwKQogKi8KSU5UMTYgV0lOQVBJIE9wZW5Db21tMTYoTFBDU1RSIGRldmljZSxVSU5UMTYgY2JJblF1ZXVlLFVJTlQxNiBjYk91dFF1ZXVlKQp7CglpbnQgcG9ydDsKCUhBTkRMRSBoYW5kbGU7CgogICAgCVRSQUNFKCIlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CgoJaWYgKHN0cmxlbihkZXZpY2UpIDwgNCkKCSAgIHJldHVybiBJRV9CQURJRDsKCglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkKCQlFUlIoIkJVRyAhIENPTTAgb3IgTFBUMCBkb24ndCBleGlzdCAhXG4iKTsKCglpZiAoIXN0cm5jYXNlY21wKGRldmljZSwiQ09NIiwzKSkgewoJCQogICAgICAgICAgICAgICAgVFJBQ0UoIiVzID0gJXNcbiIsIGRldmljZSwgQ09NW3BvcnRdLmRldmljZW5hbWUpOwoKCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoQ09NW3BvcnRdLmhhbmRsZSkKCQkJcmV0dXJuIElFX09QRU47CgoJCWhhbmRsZSA9IENyZWF0ZUZpbGVBKGRldmljZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsCgkJCUZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIENSRUFURV9BTFdBWVMsIAoJCQlGSUxFX0ZMQUdfT1ZFUkxBUFBFRHxGSUxFX0ZMQUdfTk9fQlVGRkVSSU5HLCAwICk7CgkJaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewoJCQlFUlIoIkNvdWxkbid0IG9wZW4gJXMgISAoJXMpXG4iLCBDT01bcG9ydF0uZGV2aWNlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCW1lbXNldChDT01bcG9ydF0udW5rbm93biwgMCwgc2l6ZW9mKENPTVtwb3J0XS51bmtub3duKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS5zZWdfdW5rbm93biA9IDA7CgkJCUNPTVtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJQ09NW3BvcnRdLmV2dGNoYXIgPSAwOyAvKiBGSVhNRTogZGVmYXVsdD8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwoJCQlHZXRDb21tU3RhdGUxNihwb3J0LCZDT01bcG9ydF0uZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZihDT01bcG9ydF0uYmF1ZHJhdGU+LTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRENCMTYgZGNiOwoJCQkgICAgbWVtY3B5KCZkY2IsJkNPTVtwb3J0XS5kY2Isc2l6ZW9mIGRjYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2IuQmF1ZFJhdGU9Q09NW3BvcnRdLmJhdWRyYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9yZSBkZWZhdWx0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRhdGFiaXRzLCBwYXJpdHksIHN0b3BiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbW1TdGF0ZTE2KCAmZGNiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkvKiBpbml0IHByaW9yaXR5IGNoYXJhY3RlcnMgKi8KCQkJQ09NW3BvcnRdLnVuZ2V0ID0gLTE7CgkJCUNPTVtwb3J0XS54bWl0ID0gLTE7CgkJCS8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KCQkJQ09NW3BvcnRdLmlidWZfc2l6ZSA9IGNiSW5RdWV1ZTsKCQkJQ09NW3BvcnRdLmlidWZfaGVhZCA9IENPTVtwb3J0XS5pYnVmX3RhaWwgPSAwOwoJCQlDT01bcG9ydF0ub2J1Zl9zaXplID0gY2JPdXRRdWV1ZTsKCQkJQ09NW3BvcnRdLm9idWZfaGVhZCA9IENPTVtwb3J0XS5vYnVmX3RhaWwgPSAwOwoKCQkJQ09NW3BvcnRdLmluYnVmID0gbWFsbG9jKGNiSW5RdWV1ZSk7CgkJCWlmIChDT01bcG9ydF0uaW5idWYpIHsKCQkJICBDT01bcG9ydF0ub3V0YnVmID0gbWFsbG9jKGNiT3V0UXVldWUpOwoJCQkgIGlmICghQ09NW3BvcnRdLm91dGJ1ZikKCQkJICAgIGZyZWUoQ09NW3BvcnRdLmluYnVmKTsKCQkJfSBlbHNlIENPTVtwb3J0XS5vdXRidWYgPSBOVUxMOwoJCQlpZiAoIUNPTVtwb3J0XS5vdXRidWYpIHsKCQkJICAvKiBub3QgZW5vdWdoIG1lbW9yeSAqLwoJCQkgIFNldENvbW1TdGF0ZTE2KCZDT01bcG9ydF0uZGNiKTsKCQkJICBDbG9zZUhhbmRsZShDT01bcG9ydF0uaGFuZGxlKTsKCQkJICBFUlIoIm91dCBvZiBtZW1vcnlcbiIpOwoJCQkgIHJldHVybiBJRV9NRU1PUlk7CgkJCX0KCgkJCVplcm9NZW1vcnkoJkNPTVtwb3J0XS5yZWFkX292LHNpemVvZiAoT1ZFUkxBUFBFRCkpOwoJCQlaZXJvTWVtb3J5KCZDT01bcG9ydF0ud3JpdGVfb3Ysc2l6ZW9mIChPVkVSTEFQUEVEKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb21tX3dhaXRyZWFkKCAmQ09NW3BvcnRdICk7CgkJCVVTRVIxNl9BbGVydGFibGVXYWl0Kys7CgoJCQlyZXR1cm4gcG9ydDsKCQl9Cgl9IAoJZWxzZSAKCWlmICghc3RybmNhc2VjbXAoZGV2aWNlLCJMUFQiLDMpKSB7CgkKCQlpZiAoIVZhbGlkTFBUUG9ydChwb3J0KSkKCQkJcmV0dXJuIElFX0JBRElEOwoKCQlpZiAoTFBUW3BvcnRdLmhhbmRsZSkKCQkJcmV0dXJuIElFX09QRU47CgoJCWhhbmRsZSA9IENyZWF0ZUZpbGVBKGRldmljZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsCgkJCUZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIENSRUFURV9BTFdBWVMsIDAsIDAgKTsKCQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uaGFuZGxlID0gaGFuZGxlOwoJCQlMUFRbcG9ydF0uY29tbWVycm9yID0gMDsKCQkJTFBUW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCXJldHVybiBwb3J0fEZMQUdfTFBUOwoJCX0KCX0KCXJldHVybiBJRV9CQURJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsb3NlQ29tbQkJKFVTRVIuMjA3KQogKi8KSU5UMTYgV0lOQVBJIENsb3NlQ29tbTE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIAogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCEoY2lkJkZMQUdfTFBUKSkgewoJCS8qIENPTSBwb3J0ICovCiAgICAgICAgICAgICAgICBVbk1hcExTKCBDT01bY2lkXS5zZWdfdW5rbm93biApOwoJCVVTRVIxNl9BbGVydGFibGVXYWl0LS07CgkJQ2FuY2VsSW8ocHRyLT5oYW5kbGUpOwoKCQkvKiBmcmVlIGJ1ZmZlcnMgKi8KCQlmcmVlKHB0ci0+b3V0YnVmKTsKCQlmcmVlKHB0ci0+aW5idWYpOwoKCQkvKiByZXNldCBtb2RlbSBsaW5lcyAqLwoJCVNldENvbW1TdGF0ZTE2KCZDT01bY2lkXS5kY2IpOwoJfQoKCWlmICghQ2xvc2VIYW5kbGUocHRyLT5oYW5kbGUpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwoJCS8qIEZJWE1FOiBzaG91bGQgd2UgY2xlYXIgcHRyLT5oYW5kbGUgaGVyZT8gKi8KCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXB0ci0+Y29tbWVycm9yID0gMDsKCQlwdHItPmhhbmRsZSA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShVU0VSLjIxMCkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tQnJlYWsxNihJTlQxNiBjaWQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglwdHItPnN1c3BlbmRlZCA9IDE7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsZWFyQ29tbUJyZWFrCShVU0VSLjIxMSkKICovCklOVDE2IFdJTkFQSSBDbGVhckNvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKCEocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT5zdXNwZW5kZWQgPSAwOwoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKFVTRVIuMjE0KQogKi8KTE9ORyBXSU5BUEkgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2IGNpZCxVSU5UMTYgbkZ1bmN0aW9uKQp7CglzdHJ1Y3QgIERvc0RldmljZVN0cnVjdCAqcHRyOwoJaW50CW1heDsKCiAgICAJVFJBQ0UoImNpZD0lZCwgZnVuY3Rpb249JWRcbiIsIGNpZCwgbkZ1bmN0aW9uKTsKCglzd2l0Y2gobkZ1bmN0aW9uKSB7CgljYXNlIEdFVE1BWENPTToKCSAgICAgICAgVFJBQ0UoIkdFVE1BWENPTVxuIik7IAoJCWZvciAobWF4ID0gTUFYX1BPUlRTOyFDT01bbWF4XS5kZXZpY2VuYW1lO21heC0tKQoJCQk7CgkJcmV0dXJuIG1heDsKCgljYXNlIEdFVE1BWExQVDoKCQlUUkFDRSgiR0VUTUFYTFBUXG4iKTsgCgkJZm9yIChtYXggPSBNQVhfUE9SVFM7IUxQVFttYXhdLmRldmljZW5hbWU7bWF4LS0pCgkJCTsKCQlyZXR1cm4gRkxBR19MUFQgKyBtYXg7CgoJY2FzZSBHRVRCQVNFSVJROgoJCVRSQUNFKCJHRVRCQVNFSVJRXG4iKTsgCgkJLyogRklYTUU6IHVzZSB0YWJsZXMgKi8KCQkvKiBqdXN0IGZha2Ugc29tZXRoaW5nIGZvciBub3cgKi8KCQlpZiAoY2lkICYgRkxBR19MUFQpIHsKCQkJLyogTFBUMTogaXJxIDcsIExQVDI6IGlycSA1ICovCgkJCXJldHVybiAoY2lkICYgMHg3ZikgPyA1IDogNzsKCQl9IGVsc2UgewoJCQkvKiBDT00xOiBpcnEgNCwgQ09NMjogaXJxIDMsCgkJCSAgIENPTTM6IGlycSA0LCBDT000OiBpcnEgMyAqLwoJCQlyZXR1cm4gNCAtIChjaWQgJiAxKTsKCQl9Cgl9CgoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJY2FzZSBSRVNFVERFVjoKCWNhc2UgQ0xSRFRSOgoJY2FzZSBDTFJSVFM6CgljYXNlIFNFVERUUjoKCWNhc2UgU0VUUlRTOgoJY2FzZSBTRVRYT0ZGOgoJY2FzZSBTRVRYT046CgkJaWYoRXNjYXBlQ29tbUZ1bmN0aW9uKHB0ci0+aGFuZGxlLG5GdW5jdGlvbikpCgkJCXJldHVybiAwOwoJCWVsc2UgewoJCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJCXJldHVybiAtMTsKCQl9CgoJY2FzZSBDTFJCUkVBSzoKCWNhc2UgU0VUQlJFQUs6CglkZWZhdWx0OgoJCVdBUk4oIihjaWQ9JWQsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwgCgkJCWNpZCwgbkZ1bmN0aW9uKTsKCX0KCXJldHVybiAtMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUZsdXNoQ29tbQkoVVNFUi4yMTUpCiAqLwpJTlQxNiBXSU5BUEkgRmx1c2hDb21tMTYoSU5UMTYgY2lkLElOVDE2IGZuUXVldWUpCnsKCURXT1JEIHF1ZXVlOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkLCBxdWV1ZT0lZFxuIiwgY2lkLCBmblF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9Cglzd2l0Y2ggKGZuUXVldWUpIHsKCWNhc2UgMDoKCQlxdWV1ZSA9IFBVUkdFX1RYQUJPUlQ7CgkJcHRyLT5vYnVmX3RhaWwgPSBwdHItPm9idWZfaGVhZDsKCQlicmVhazsKCWNhc2UgMToKCQlxdWV1ZSA9IFBVUkdFX1JYQUJPUlQ7CgkJcHRyLT5pYnVmX2hlYWQgPSBwdHItPmlidWZfdGFpbDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJV0FSTigiKGNpZD0lZCxmblF1ZXVlPSVkKTpVbmtub3duIHF1ZXVlXG4iLCAKCQkgICAgICAgICAgICBjaWQsIGZuUXVldWUpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIVB1cmdlQ29tbShwdHItPmhhbmRsZSxxdWV1ZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwkKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9ICAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXJyb3IJKFVTRVIuMjAzKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1FcnJvcjE2KElOVDE2IGNpZCxMUENPTVNUQVQxNiBscFN0YXQpCnsKCWludAkJdGVtcGVycm9yOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CgoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCglpZiAobHBTdGF0KSB7CgkJbHBTdGF0LT5zdGF0dXMgPSAwOwoKCQlXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoMCxOVUxMLEZBTFNFLDEsVFJVRSk7CgoJCWxwU3RhdC0+Y2JPdXRRdWUgPSBjb21tX291dGJ1ZihwdHIpOwoJCWxwU3RhdC0+Y2JJblF1ZSA9IGNvbW1faW5idWYocHRyKTsKCiAgICAJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBzdGF0ICVkIGluICVkIG91dCAlZCwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCBscFN0YXQtPnN0YXR1cywgbHBTdGF0LT5jYkluUXVlLCAKCQkJICAgICBscFN0YXQtPmNiT3V0UXVlLCAqc3RvbCk7Cgl9CgllbHNlCgkJVFJBQ0UoImNpZCAlZCwgZXJyb3IgJWQsIGxwU3RhdCBOVUxMIHN0b2wgJXhcbiIsCgkJCSAgICAgY2lkLCBwdHItPmNvbW1lcnJvciwgKnN0b2wpOwoKCS8qIFJldHVybiBhbnkgZXJyb3JzIGFuZCBjbGVhciBpdCAqLwoJdGVtcGVycm9yID0gcHRyLT5jb21tZXJyb3I7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4odGVtcGVycm9yKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1FdmVudE1hc2sJKFVTRVIuMjA4KQogKi8KU0VHUFRSIFdJTkFQSSBTZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmdUV2dE1hc2spCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKICAgICAgICB1bnNpZ25lZCBjaGFyICpzdG9sOwoKICAgIAlUUkFDRSgiY2lkICVkLG1hc2sgJWRcbiIsY2lkLGZ1RXZ0TWFzayk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAoU0VHUFRSKU5VTEw7Cgl9CgoJcHRyLT5ldmVudG1hc2sgPSBmdUV2dE1hc2s7CgogICAgICAgIGlmICgoY2lkJkZMQUdfTFBUKSB8fCAhVmFsaWRDT01Qb3J0KGNpZCkpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAoU0VHUFRSKU5VTEw7CiAgICAgICAgfQogICAgICAgIC8qIGl0J3MgYSBDT00gcG9ydCA/IC0+IG1vZGlmeSBmbGFncyAqLwogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCglUUkFDRSgiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwogICAgICAgIGlmICghQ09NW2NpZF0uc2VnX3Vua25vd24pIENPTVtjaWRdLnNlZ191bmtub3duID0gTWFwTFMoIENPTVtjaWRdLnVua25vd24gKTsKICAgICAgICByZXR1cm4gQ09NW2NpZF0uc2VnX3Vua25vd247Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXZlbnRNYXNrCShVU0VSLjIwOSkKICovClVJTlQxNiBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzazE2KElOVDE2IGNpZCxVSU5UMTYgZm5FdnRDbGVhcikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJV09SRCBldmVudHM7CgogICAgCVRSQUNFKCJjaWQgJWQsIG1hc2sgJWRcbiIsIGNpZCwgZm5FdnRDbGVhcik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJICAgIHJldHVybiAwOwoJfQoKICAgICAgICBpZiAoKGNpZCZGTEFHX0xQVCkgfHwgIVZhbGlkQ09NUG9ydChjaWQpKSB7CiAgICAgICAgICAgIFdBUk4oIiBjaWQgJWQgbm90IGNvbW0gcG9ydFxuIixjaWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJZXZlbnRzID0gKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJiBmbkV2dENsZWFyOwoJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgJj0gfmZuRXZ0Q2xlYXI7CglyZXR1cm4gZXZlbnRzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVN0YXRlCShVU0VSLjIwMSkKICovCklOVDE2IFdJTkFQSSBTZXRDb21tU3RhdGUxNihMUERDQjE2IGxwZGNiKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglEQ0IgZGNiOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXBcbiIsIGxwZGNiLT5JZCwgbHBkY2IpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QobHBkY2ItPklkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsbHBkY2ItPklkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtc2V0KCZkY2IsMCxzaXplb2YgZGNiKTsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YgZGNiOwoKCS8qCgkgKiBhY2NvcmRpbmcgdG8gTVNETiwgd2Ugc2hvdWxkIGZpcnN0IGludGVycHJldCBscGRjYi0+QmF1ZFJhdGUgYXMgZm9sbG93czoKCSAqIDEuIGlmIHRoZSBiYXVkIHJhdGUgaXMgYSBDQlIgY29uc3RhbnQsIGludGVycHJldCBpdC4KCSAqIDIuIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiA1NzYwMCwgdGhlIGJhdWQgcmF0ZSBpcyAxMTUyMDAKCSAqIDMuIHVzZSB0aGUgYWN0dWFsIGJhdWRyYXRlCgkgKiBzdGVwcyAyIGFuZCAzIGFyZSBlcXVpdmlsZW50IHRvIDE2NTUwIGJhdWRyYXRlIGRpdmlzb3IgPSAxMTUyMDAvQmF1ZFJhdGUKCSAqIHNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvcTEwOC85LzI4LmFzcAoJICovCglzd2l0Y2gobHBkY2ItPkJhdWRSYXRlKQoJewoJY2FzZSBDQlJfMTEwOiAgICBkY2IuQmF1ZFJhdGUgPSAxMTA7ICAgIGJyZWFrOwoJY2FzZSBDQlJfMzAwOiAgICBkY2IuQmF1ZFJhdGUgPSAzMDA7ICAgIGJyZWFrOwoJY2FzZSBDQlJfNjAwOiAgICBkY2IuQmF1ZFJhdGUgPSA2MDA7ICAgIGJyZWFrOwoJY2FzZSBDQlJfMTIwMDogICBkY2IuQmF1ZFJhdGUgPSAxMjAwOyAgIGJyZWFrOwoJY2FzZSBDQlJfMjQwMDogICBkY2IuQmF1ZFJhdGUgPSAyNDAwOyAgIGJyZWFrOwoJY2FzZSBDQlJfNDgwMDogICBkY2IuQmF1ZFJhdGUgPSA0ODAwOyAgIGJyZWFrOwoJY2FzZSBDQlJfOTYwMDogICBkY2IuQmF1ZFJhdGUgPSA5NjAwOyAgIGJyZWFrOwoJY2FzZSBDQlJfMTQ0MDA6ICBkY2IuQmF1ZFJhdGUgPSAxNDQwMDsgIGJyZWFrOwoJY2FzZSBDQlJfMTkyMDA6ICBkY2IuQmF1ZFJhdGUgPSAxOTIwMDsgIGJyZWFrOwoJY2FzZSBDQlJfMzg0MDA6ICBkY2IuQmF1ZFJhdGUgPSAzODQwMDsgIGJyZWFrOwoJY2FzZSBDQlJfNTYwMDA6ICBkY2IuQmF1ZFJhdGUgPSA1NjAwMDsgIGJyZWFrOwoJY2FzZSBDQlJfMTI4MDAwOiBkY2IuQmF1ZFJhdGUgPSAxMjgwMDA7IGJyZWFrOwoJY2FzZSBDQlJfMjU2MDAwOiBkY2IuQmF1ZFJhdGUgPSAyNTYwMDA7IGJyZWFrOwoJZGVmYXVsdDoKCQlpZihscGRjYi0+QmF1ZFJhdGU+NTc2MDApCgkJZGNiLkJhdWRSYXRlID0gMTE1MjAwOwogICAgICAgIGVsc2UKCQlkY2IuQmF1ZFJhdGUgPSBscGRjYi0+QmF1ZFJhdGU7CiAJfQoJCiAgICAgICAgZGNiLkJ5dGVTaXplPWxwZGNiLT5CeXRlU2l6ZTsKICAgICAgICBkY2IuU3RvcEJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKCWRjYi5mUGFyaXR5PWxwZGNiLT5mUGFyaXR5OwoJZGNiLlBhcml0eT1scGRjYi0+UGFyaXR5OwoKCWRjYi5mT3V0eEN0c0Zsb3cgPSBscGRjYi0+Zk91dHhDdHNGbG93OwoKCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93KQoJCWRjYi5mUnRzQ29udHJvbCA9IFRSVUU7CgoJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkgCgkJZGNiLmZEdHJDb250cm9sID0gVFJVRTsKCglwdHItPmV2dGNoYXIgPSBscGRjYi0+RXZ0Q2hhcjsKCglkY2IuZkluWCA9IGxwZGNiLT5mSW5YOwoJZGNiLmZPdXRYID0gbHBkY2ItPmZPdXRYOwogICAgICAgIAoJaWYgKCFTZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXJldHVybiAwOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR2V0Q29tbVN0YXRlCShVU0VSLjIwMikKICovCklOVDE2IFdJTkFQSSBHZXRDb21tU3RhdGUxNihJTlQxNiBjaWQsIExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCURDQiBkY2I7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgY2lkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICghR2V0Q29tbVN0YXRlKHB0ci0+aGFuZGxlLCZkY2IpKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKCQlyZXR1cm4gLTE7Cgl9CgoJbHBkY2ItPklkID0gY2lkOwoKCUNPTU0xNl9EQ0J0b0RDQjE2KCZkY2IsbHBkY2IpOwoKCWxwZGNiLT5FdnRDaGFyID0gcHRyLT5ldnRjaGFyOwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVHJhbnNtaXRDb21tQ2hhcgkoVVNFUi4yMDYpCiAqLwpJTlQxNiBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVHJhbnNtaXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgZGF0YSAlZCBcbiIsIGNpZCwgY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYgKHB0ci0+eG1pdCA+PSAwKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfVFhGVUxMOwoJICByZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+b2J1Zl9oZWFkID09IHB0ci0+b2J1Zl90YWlsKSB7CgkgIC8qIHRyYW5zbWl0IHF1ZXVlIGVtcHR5LCB0cnkgdG8gdHJhbnNtaXQgZGlyZWN0bHkgKi8KCSAgaWYoMSE9Q09NTTE2X1dyaXRlRmlsZShwdHItPmhhbmRsZSwgJmNoVHJhbnNtaXQsIDEpKQoJICB7CgkgICAgLyogZGlkbid0IHdvcmssIHF1ZXVlIGl0ICovCgkgICAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgICBjb21tX3dhaXR3cml0ZShwdHIpOwoJICB9Cgl9IGVsc2UgewoJICAvKiBkYXRhIGluIHF1ZXVlLCBsZXQgdGhpcyBjaGFyIGJlIHRyYW5zbWl0dGVkIG5leHQgKi8KCSAgcHRyLT54bWl0ID0gY2hUcmFuc21pdDsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVuZ2V0Q29tbUNoYXIJKFVTRVIuMjEyKQogKi8KSU5UMTYgV0lOQVBJIFVuZ2V0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFVuZ2V0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQgKGNoYXIgJWQpXG4iLCBjaWQsIGNoVW5nZXQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoKCWlmIChwdHItPnVuZ2V0Pj0wKSB7CgkgIC8qIGNoYXJhY3RlciBhbHJlYWR5IHF1ZXVlZCAqLwoJICAvKiBGSVhNRTogd2hpY2ggZXJyb3Igd291bGQgV2luZG93cyByZXR1cm4/ICovCgkgIHB0ci0+Y29tbWVycm9yID0gQ0VfUlhPVkVSOwoJICByZXR1cm4gLTE7Cgl9CgoJcHRyLT51bmdldCA9IGNoVW5nZXQ7CgoJcHRyLT5jb21tZXJyb3IgPSAwOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSZWFkQ29tbQkoVVNFUi4yMDQpCiAqLwpJTlQxNiBXSU5BUEkgUmVhZENvbW0xNihJTlQxNiBjaWQsTFBTVFIgbHB2QnVmLElOVDE2IGNiUmVhZCkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJTFBTVFIgb3JnQnVmID0gbHB2QnVmOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgY2lkLCBscHZCdWYsIGNiUmVhZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0JCgoJaWYoMD09Y29tbV9pbmJ1ZihwdHIpKQoJCVdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCgwLE5VTEwsRkFMU0UsMSxUUlVFKTsKCgkvKiByZWFkIHVuZ2V0IGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+dW5nZXQ+PTApIHsKCQkqbHB2QnVmKysgPSBwdHItPnVuZ2V0OwoJCXB0ci0+dW5nZXQgPSAtMTsKCgkJbGVuZ3RoID0gMTsKCX0gZWxzZQoJIAlsZW5ndGggPSAwOwoKCS8qIHJlYWQgZnJvbSByZWNlaXZlIGJ1ZmZlciAqLwoJd2hpbGUgKGxlbmd0aCA8IGNiUmVhZCkgewoJICBzdGF0dXMgPSAoKHB0ci0+aWJ1Zl9oZWFkIDwgcHRyLT5pYnVmX3RhaWwpID8KCQkgICAgcHRyLT5pYnVmX3NpemUgOiBwdHItPmlidWZfaGVhZCkgLSBwdHItPmlidWZfdGFpbDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiUmVhZCAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JSZWFkIC0gbGVuZ3RoOwoKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl90YWlsLCBzdGF0dXMpOwoJICBwdHItPmlidWZfdGFpbCArPSBzdGF0dXM7CgkgIGlmIChwdHItPmlidWZfdGFpbCA+PSBwdHItPmlidWZfc2l6ZSkKCSAgICBwdHItPmlidWZfdGFpbCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7Cgl9CgoJVFJBQ0UoIiVzXG4iLCBkZWJ1Z3N0cl9hbiggb3JnQnVmLCBsZW5ndGggKSk7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCgkJY2lkLCBscHZCdWYsIGNiV3JpdGUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CQoJCglUUkFDRSgiJXNcbiIsIGRlYnVnc3RyX2FuKCBscHZCdWYsIGNiV3JpdGUgKSk7CgoJbGVuZ3RoID0gMDsKCXdoaWxlIChsZW5ndGggPCBjYldyaXRlKSB7CgkgIGlmICgocHRyLT5vYnVmX2hlYWQgPT0gcHRyLT5vYnVmX3RhaWwpICYmIChwdHItPnhtaXQgPCAwKSkgewoJICAgIC8qIG5vIGRhdGEgcXVldWVkLCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgKi8KCSAgICBzdGF0dXMgPSBDT01NMTZfV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCBscHZCdWYsIGNiV3JpdGUgLSBsZW5ndGgpOwoJICAgIGlmIChzdGF0dXMgPiAwKSB7CgkgICAgICBscHZCdWYgKz0gc3RhdHVzOwoJICAgICAgbGVuZ3RoICs9IHN0YXR1czsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgfQoJICAvKiBjYW4ndCB3cml0ZSBkaXJlY3RseSwgcHV0IGludG8gdHJhbnNtaXQgYnVmZmVyICovCgkgIHN0YXR1cyA9ICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPwoJCSAgICAocHRyLT5vYnVmX3RhaWwtMSkgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfaGVhZDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiV3JpdGUgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiV3JpdGUgLSBsZW5ndGg7CgkgIG1lbWNweShscHZCdWYsIHB0ci0+b3V0YnVmICsgcHRyLT5vYnVmX2hlYWQsIHN0YXR1cyk7CgkgIHB0ci0+b2J1Zl9oZWFkICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+b2J1Zl9oZWFkID49IHB0ci0+b2J1Zl9zaXplKQoJICAgIHB0ci0+b2J1Zl9oZWFkID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CQoJcmV0dXJuIGxlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBFbmFibGVDb21tTm90aWZpY2F0aW9uICAgKFVTRVIuMjQ1KQogKi8KQk9PTDE2IFdJTkFQSSBFbmFibGVDb21tTm90aWZpY2F0aW9uMTYoIElOVDE2IGNpZCwgSFdORDE2IGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY2JXcml0ZU5vdGlmeSwgSU5UMTYgY2JPdXRRdWV1ZSApCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglUUkFDRSgiKCVkLCAleCwgJWQsICVkKVxuIiwgY2lkLCBod25kLCBjYldyaXRlTm90aWZ5LCBjYk91dFF1ZXVlKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJcHRyLT53bmQgPSBXSU5fSGFuZGxlMzIoIGh3bmQgKTsKCXB0ci0+bl9yZWFkID0gY2JXcml0ZU5vdGlmeTsKCXB0ci0+bl93cml0ZSA9IGNiT3V0UXVldWU7CglyZXR1cm4gVFJVRTsKfQoK