LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIENvcHlyaWdodCAyMDAxIE1pa2UgTWNDb3JtYWNrCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogQXByIDMsIDE5OTkuICBMYXdzb24gV2hpdG5leSA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqIC0gRml4ZWQgdGhlIG1vZGVtIGNvbnRyb2wgcGFydCBvZiBFc2NhcGVDb21tRnVuY3Rpb24xNi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWF5IDI2LCAxOTk3LiAgRml4ZXMgYW5kIGNvbW1lbnRzIGJ5IFJpY2sgUmljaGFyZHNvbiA8cmlja0BkZ2lpLmNvbT4gW1JFUl0KICogLSBwdHItPmZkIHdhc24ndCBnZXR0aW5nIGNsZWFyZWQgb24gY2xvc2UuCiAqIC0gR2V0Q29tbUV2ZW50TWFzaygpIGFuZCBHZXRDb21tRXJyb3IoKSBkaWRuJ3QgZG8gbXVjaCBvZiBhbnl0aGluZy4KICogICBJTUhPLCB0aGV5IGFyZSBzdGlsbCB3cm9uZywgYnV0IHRoZXkgYXQgbGVhc3QgaW1wbGVtZW50IHRoZSBSWENIQVIKICogICBldmVudCBhbmQgcmV0dXJuIEkvTyBxdWV1ZSBzaXplcywgd2hpY2ggbWFrZXMgdGhlIGFwcCBJJ20gaW50ZXJlc3RlZAogKiAgIGluIChhbmFsb2cgZGV2aWNlcyBFWktJVCBEU1AgZGV2ZWxvcG1lbnQgc3lzdGVtKSB3b3JrLgogKgogKiBBdWd1c3QgMTIsIDE5OTcuICBUYWtlIGEgYmFzaCBhdCBTZXRDb21tRXZlbnRNYXNrIC0gTGF3c29uIFdoaXRuZXkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogKiBKdWx5IDYsIDE5OTguIEZpeGVzIGFuZCBjb21tZW50cyBieSBWYWxlbnRpam4gU2Vzc2luawogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnNlc3NpbmtAaWMudXZhLm5sPiBbVl0KICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJ1c2VyX3ByaXZhdGUuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChjb21tKTsKCi8qIHdpbmRvdydzIHNlbWkgZG9jdW1lbnRlZCBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KI2RlZmluZSBDT01NX01TUl9PRkZTRVQgIDM1CiNkZWZpbmUgTVNSX0NUUyAgMHgxMAojZGVmaW5lIE1TUl9EU1IgIDB4MjAKI2RlZmluZSBNU1JfUkkgICAweDQwCiNkZWZpbmUgTVNSX1JMU0QgMHg4MAojZGVmaW5lIE1TUl9NQVNLIChNU1JfQ1RTfE1TUl9EU1J8TVNSX1JJfE1TUl9STFNEKQoKI2RlZmluZSBGTEFHX0xQVCAweDgwCgojZGVmaW5lIE1BWF9QT1JUUyAgIDkKCnN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgewogICAgSEFORExFIGhhbmRsZTsKICAgIGludCBzdXNwZW5kZWQ7CiAgICBpbnQgdW5nZXQseG1pdDsKICAgIGludCBldnRjaGFyOwogICAgLyogZXZlbnRzICovCiAgICBpbnQgY29tbWVycm9yLCBldmVudG1hc2s7CiAgICAvKiBidWZmZXJzICovCiAgICBjaGFyICppbmJ1Ziwqb3V0YnVmOwogICAgdW5zaWduZWQgaWJ1Zl9zaXplLGlidWZfaGVhZCxpYnVmX3RhaWw7CiAgICB1bnNpZ25lZCBvYnVmX3NpemUsb2J1Zl9oZWFkLG9idWZfdGFpbDsKICAgIC8qIG5vdGlmaWNhdGlvbnMgKi8KICAgIEhXTkQgd25kOwogICAgaW50IG5fcmVhZCwgbl93cml0ZTsKICAgIE9WRVJMQVBQRUQgcmVhZF9vdiwgd3JpdGVfb3Y7CiAgICAvKiBzYXZlIHRlcm1pbmFsIHN0YXRlcyAqLwogICAgRENCMTYgZGNiOwogICAgLyogcG9pbnRlciB0byB1bmtub3duKD09dW5kb2N1bWVudGVkKSBjb21tIHN0cnVjdHVyZSAqLwogICAgU0VHUFRSIHNlZ191bmtub3duOwogICAgQllURSB1bmtub3duWzQwXTsKfTsKCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0IENPTVtNQVhfUE9SVFNdOwpzdGF0aWMgc3RydWN0IERvc0RldmljZVN0cnVjdCBMUFRbTUFYX1BPUlRTXTsKCi8qIHVwZGF0ZSB3aW5kb3cncyBzZW1pIGRvY3VtZW50ZWQgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCi8qIHNlZSBrbm93bGVkZ2UgYmFzZSBRMTAxNDE3ICovCnN0YXRpYyB2b2lkIENPTU1fTVNSVXBkYXRlKCBIQU5ETEUgaGFuZGxlLCBVQ0hBUiAqIHBNc3IgKQp7CiAgICBVQ0hBUiB0bXBtc3I9MDsKICAgIERXT1JEIG1zdGF0PTA7CgogICAgaWYoIUdldENvbW1Nb2RlbVN0YXR1cyhoYW5kbGUsJm1zdGF0KSkKICAgICAgICByZXR1cm47CgogICAgaWYobXN0YXQgJiBNU19DVFNfT04pIHRtcG1zciB8PSBNU1JfQ1RTOwogICAgaWYobXN0YXQgJiBNU19EU1JfT04pIHRtcG1zciB8PSBNU1JfRFNSOwogICAgaWYobXN0YXQgJiBNU19SSU5HX09OKSB0bXBtc3IgfD0gTVNSX1JJOwogICAgaWYobXN0YXQgJiBNU19STFNEX09OKSB0bXBtc3IgfD0gTVNSX1JMU0Q7CiAgICAqcE1zciA9ICgqcE1zciAmIH5NU1JfTUFTSykgfCB0bXBtc3I7Cn0KCnN0YXRpYyBzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpHZXREZXZpY2VTdHJ1Y3QoaW50IGluZGV4KQp7CglpZiAoKGluZGV4JjB4N0YpPD1NQVhfUE9SVFMpIHsKICAgICAgICAgICAgaWYgKCEoaW5kZXgmRkxBR19MUFQpKSB7CgkJaWYgKENPTVtpbmRleF0uaGFuZGxlKQoJCSAgICByZXR1cm4gJkNPTVtpbmRleF07CgkgICAgfSBlbHNlIHsKCQlpbmRleCAmPSAweDdmOwoJCWlmIChMUFRbaW5kZXhdLmhhbmRsZSkKCQkgICAgcmV0dXJuICZMUFRbaW5kZXhdOwoJICAgIH0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCAgICBHZXRDb21tUG9ydF9vdihMUE9WRVJMQVBQRUQgb3YsIGludCB3cml0ZSkKewoJaW50IHg7CgoJZm9yICh4PTA7IHg8TUFYX1BPUlRTOyB4KyspIHsKCQlpZiAob3YgPT0gKHdyaXRlPyZDT01beF0ud3JpdGVfb3Y6JkNPTVt4XS5yZWFkX292KSkKCQkJcmV0dXJuIHg7Cgl9CgoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IFdpbkVycm9yKHZvaWQpCnsKICAgICAgICBUUkFDRSgiZXJybm8gPSAlZFxuIiwgZXJybm8pOwoJc3dpdGNoIChlcnJubykgewoJCWRlZmF1bHQ6CgkJCXJldHVybiBDRV9JT0U7CgkJfQp9CgpzdGF0aWMgdW5zaWduZWQgY29tbV9pbmJ1ZihzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHIpCnsKICByZXR1cm4gKChwdHItPmlidWZfdGFpbCA+IHB0ci0+aWJ1Zl9oZWFkKSA/IHB0ci0+aWJ1Zl9zaXplIDogMCkKICAgICsgcHRyLT5pYnVmX2hlYWQgLSBwdHItPmlidWZfdGFpbDsKfQoKc3RhdGljIHVuc2lnbmVkIGNvbW1fb3V0YnVmKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewogIHJldHVybiAoKHB0ci0+b2J1Zl90YWlsID4gcHRyLT5vYnVmX2hlYWQpID8gcHRyLT5vYnVmX3NpemUgOiAwKQogICAgKyBwdHItPm9idWZfaGVhZCAtIHB0ci0+b2J1Zl90YWlsOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cik7CgpzdGF0aWMgVk9JRCBXSU5BUEkgQ09NTTE2X1JlYWRDb21wbGV0ZShEV09SRCBkd0Vycm9yQ29kZSwgRFdPUkQgbGVuLCBMUE9WRVJMQVBQRUQgb3YpCnsKCWludCBwcmV2OwoJV09SRCBtYXNrID0gMDsKCWludCBjaWQgPSBHZXRDb21tUG9ydF9vdihvdiwwKTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCglpZihjaWQ8MCkgewoJCUVSUigiYXN5bmMgd3JpdGUgd2l0aCBiYWQgb3ZlcmxhcHBlZCBwb2ludGVyXG4iKTsKCQlyZXR1cm47Cgl9CglwdHIgPSAmQ09NW2NpZF07CgoJLyogd2UgZ2V0IGNhbmNlbGxlZCB3aGVuIENsb3NlQ29tbSBpcyBjYWxsZWQgKi8KCWlmIChkd0Vycm9yQ29kZT09RVJST1JfT1BFUkFUSU9OX0FCT1JURUQpCgl7CgkJVFJBQ0UoIkNhbmNlbGxlZFxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIHJlYWQgZGF0YSBmcm9tIGNvbW0gcG9ydCAqLwoJaWYgKGR3RXJyb3JDb2RlICE9IE5PX0VSUk9SKSB7CgkJRVJSKCJhc3luYyByZWFkIGZhaWxlZCwgZXJyb3IgJWRcbiIsZHdFcnJvckNvZGUpOwoJCUNPTVtjaWRdLmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCQlyZXR1cm47Cgl9CglUUkFDRSgiYXN5bmMgcmVhZCBjb21wbGV0ZWQgJWQgYnl0ZXNcbiIsbGVuKTsKCglwcmV2ID0gY29tbV9pbmJ1ZihwdHIpOwoKCS8qIGNoZWNrIGZvciBldmVudHMgKi8KCWlmICgocHRyLT5ldmVudG1hc2sgJiBFVl9SWEZMQUcpICYmCgkgICAgbWVtY2hyKHB0ci0+aW5idWYgKyBwdHItPmlidWZfaGVhZCwgcHRyLT5ldnRjaGFyLCBsZW4pKSB7CgkJKihXT1JEKikoQ09NW2NpZF0udW5rbm93bikgfD0gRVZfUlhGTEFHOwoJCW1hc2sgfD0gQ05fRVZFTlQ7Cgl9CglpZiAocHRyLT5ldmVudG1hc2sgJiBFVl9SWENIQVIpIHsKCQkqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSB8PSBFVl9SWENIQVI7CgkJbWFzayB8PSBDTl9FVkVOVDsKCX0KCgkvKiBhZHZhbmNlIGJ1ZmZlciBwb3NpdGlvbiAqLwoJcHRyLT5pYnVmX2hlYWQgKz0gbGVuOwoJaWYgKHB0ci0+aWJ1Zl9oZWFkID49IHB0ci0+aWJ1Zl9zaXplKQoJCXB0ci0+aWJ1Zl9oZWFkID0gMDsKCgkvKiBjaGVjayBmb3Igbm90aWZpY2F0aW9uICovCglpZiAocHRyLT53bmQgJiYgKHB0ci0+bl9yZWFkPjApICYmIChwcmV2PHB0ci0+bl9yZWFkKSAmJgoJICAgIChjb21tX2luYnVmKHB0cik+PXB0ci0+bl9yZWFkKSkgewoJCS8qIHBhc3NlZCB0aGUgcmVjZWl2ZSBub3RpZmljYXRpb24gdGhyZXNob2xkICovCgkJbWFzayB8PSBDTl9SRUNFSVZFOwoJfQoKCS8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCglpZiAocHRyLT53bmQgJiYgbWFzaykgewoJCVRSQUNFKCJub3RpZnlpbmcgJXA6IGNpZD0lZCwgbWFzaz0lMDJ4XG4iLCBwdHItPnduZCwgY2lkLCBtYXNrKTsKCQlQb3N0TWVzc2FnZUEocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7Cgl9CgoJLyogb24gcmVhbCB3aW5kb3dzLCB0aGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zLCBzaW5jZSBpdCBpcyByZWN1cnNpdmUgKi8KCS8qIHJlc3RhcnQgdGhlIHJlY2VpdmUgKi8KCWNvbW1fd2FpdHJlYWQocHRyKTsKfQoKLyogdGhpcyBpcyBtZWFudCB0byB3b3JrIGxpa2Ugd3JpdGUoKSAqLwpzdGF0aWMgSU5UIENPTU0xNl9Xcml0ZUZpbGUoSEFORExFIGhDb21tLCBMUENWT0lEIGJ1ZmZlciwgRFdPUkQgbGVuKQp7CglPVkVSTEFQUEVEIG92OwoJRFdPUkQgY291bnQ9IC0xOwoKCVplcm9NZW1vcnkoJm92LHNpemVvZihvdikpOwoJb3YuaEV2ZW50ID0gQ3JlYXRlRXZlbnRXKE5VTEwsMCwwLE5VTEwpOwoJaWYob3YuaEV2ZW50PT1JTlZBTElEX0hBTkRMRV9WQUxVRSkKCQlyZXR1cm4gLTE7CgoJaWYoIVdyaXRlRmlsZShoQ29tbSxidWZmZXIsbGVuLCZjb3VudCwmb3YpKQoJewoJCWlmKEdldExhc3RFcnJvcigpPT1FUlJPUl9JT19QRU5ESU5HKQoJCXsKCQkJR2V0T3ZlcmxhcHBlZFJlc3VsdChoQ29tbSwmb3YsJmNvdW50LFRSVUUpOwoJCX0KCX0KCUNsb3NlSGFuZGxlKG92LmhFdmVudCk7CgoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgVk9JRCBXSU5BUEkgQ09NTTE2X1dyaXRlQ29tcGxldGUoRFdPUkQgZHdFcnJvckNvZGUsIERXT1JEIGxlbiwgTFBPVkVSTEFQUEVEIG92KQp7CglpbnQgcHJldiwgYmxlZnQ7CglXT1JEIG1hc2sgPSAwOwoJaW50IGNpZCA9IEdldENvbW1Qb3J0X292KG92LDEpOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCWlmKGNpZDwwKSB7CgkJRVJSKCJhc3luYyB3cml0ZSB3aXRoIGJhZCBvdmVybGFwcGVkIHBvaW50ZXJcbiIpOwoJCXJldHVybjsKCX0KCXB0ciA9ICZDT01bY2lkXTsKCgkvKiByZWFkIGRhdGEgZnJvbSBjb21tIHBvcnQgKi8KCWlmIChkd0Vycm9yQ29kZSAhPSBOT19FUlJPUikgewoJCUVSUigiYXN5bmMgd3JpdGUgZmFpbGVkLCBlcnJvciAlZFxuIixkd0Vycm9yQ29kZSk7CgkJQ09NW2NpZF0uY29tbWVycm9yID0gQ0VfUlhPVkVSOwoJCXJldHVybjsKCX0KCVRSQUNFKCJhc3luYyB3cml0ZSBjb21wbGV0ZWQgJWQgYnl0ZXNcbiIsbGVuKTsKCgkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBwb2ludGVycyAqLwoJcHJldiA9IGNvbW1fb3V0YnVmKCZDT01bY2lkXSk7CglwdHItPm9idWZfdGFpbCArPSBsZW47CglpZiAocHRyLT5vYnVmX3RhaWwgPj0gcHRyLT5vYnVmX3NpemUpCgkJcHRyLT5vYnVmX3RhaWwgPSAwOwoKCS8qIHdyaXRlIGFueSBUcmFuc21pdENvbW1DaGFyIGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+eG1pdD49MCkgewoJCWxlbiA9IENPTU0xNl9Xcml0ZUZpbGUocHRyLT5oYW5kbGUsICYocHRyLT54bWl0KSwgMSk7CgkJaWYgKGxlbiA+IDApIHB0ci0+eG1pdCA9IC0xOwoJfQoKCS8qIHdyaXRlIGZyb20gb3V0cHV0IHF1ZXVlICovCglibGVmdCA9ICgocHRyLT5vYnVmX3RhaWwgPD0gcHRyLT5vYnVmX2hlYWQpID8KCQlwdHItPm9idWZfaGVhZCA6IHB0ci0+b2J1Zl9zaXplKSAtIHB0ci0+b2J1Zl90YWlsOwoKCS8qIGNoZWNrIGZvciBub3RpZmljYXRpb24gKi8KCWlmIChwdHItPnduZCAmJiAocHRyLT5uX3dyaXRlPjApICYmIChwcmV2Pj1wdHItPm5fd3JpdGUpICYmCgkgIChjb21tX291dGJ1ZihwdHIpPHB0ci0+bl93cml0ZSkpIHsKCQkvKiBwYXNzZWQgdGhlIHRyYW5zbWl0IG5vdGlmaWNhdGlvbiB0aHJlc2hvbGQgKi8KCQltYXNrIHw9IENOX1RSQU5TTUlUOwoJfQoKCS8qIHNlbmQgbm90aWZpY2F0aW9ucywgaWYgYW55ICovCglpZiAocHRyLT53bmQgJiYgbWFzaykgewoJCVRSQUNFKCJub3RpZnlpbmcgJXA6IGNpZD0lZCwgbWFzaz0lMDJ4XG4iLCBwdHItPnduZCwgY2lkLCBtYXNrKTsKCQlQb3N0TWVzc2FnZUEocHRyLT53bmQsIFdNX0NPTU1OT1RJRlksIGNpZCwgbWFzayk7Cgl9CgoJLyogc3RhcnQgYWdhaW4gaWYgbmVjZXNzYXJ5ICovCglpZihibGVmdCkKCQljb21tX3dhaXR3cml0ZShwdHIpOwp9CgpzdGF0aWMgdm9pZCBjb21tX3dhaXRyZWFkKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewoJdW5zaWduZWQgaW50IGJsZWZ0OwoJQ09NU1RBVCBzdGF0OwoKCS8qIEZJWE1FOiBnZXQgdGltZW91dHMgd29ya2luZyBwcm9wZXJseSBzbyB3ZSBjYW4gcmVhZCBibGVmdCBieXRlcyAqLwoJYmxlZnQgPSAoKHB0ci0+aWJ1Zl90YWlsID4gcHRyLT5pYnVmX2hlYWQpID8KCQkocHRyLT5pYnVmX3RhaWwtMSkgOiBwdHItPmlidWZfc2l6ZSkgLSBwdHItPmlidWZfaGVhZDsKCgkvKiBmaW5kIG91dCBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgYnVmZmVyICovCglpZihDbGVhckNvbW1FcnJvcihwdHItPmhhbmRsZSxOVUxMLCZzdGF0KSkKCQlibGVmdCA9IChibGVmdDxzdGF0LmNiSW5RdWUpID8gYmxlZnQgOiBzdGF0LmNiSW5RdWU7CgllbHNlCgkJYmxlZnQgPSAxOwoKCS8qIGFsd2F5cyByZWFkIGF0IGxlYXN0IG9uZSBieXRlICovCglpZihibGVmdD09MCkKCQlibGVmdCsrOwoKCVJlYWRGaWxlRXgocHRyLT5oYW5kbGUsCgkJcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl9oZWFkLAoJCWJsZWZ0LAoJCSZwdHItPnJlYWRfb3YsCgkJQ09NTTE2X1JlYWRDb21wbGV0ZSk7Cn0KCnN0YXRpYyB2b2lkIGNvbW1fd2FpdHdyaXRlKHN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cikKewoJaW50IGJsZWZ0OwoKCWJsZWZ0ID0gKChwdHItPm9idWZfdGFpbCA8PSBwdHItPm9idWZfaGVhZCkgPwoJCXB0ci0+b2J1Zl9oZWFkIDogcHRyLT5vYnVmX3NpemUpIC0gcHRyLT5vYnVmX3RhaWw7CglXcml0ZUZpbGVFeChwdHItPmhhbmRsZSwKCQlwdHItPm91dGJ1ZiArIHB0ci0+b2J1Zl90YWlsLAoJCWJsZWZ0LAoJCSZwdHItPndyaXRlX292LAoJCUNPTU0xNl9Xcml0ZUNvbXBsZXRlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNPTU0xNl9EQ0J0b0RDQjE2CShJbnRlcm5hbCkKICovCnN0YXRpYyBJTlQxNiBDT01NMTZfRENCdG9EQ0IxNihMUERDQiBscGRjYiwgTFBEQ0IxNiBscGRjYjE2KQp7CglpZihscGRjYi0+QmF1ZFJhdGU8MHgxMDAwMCkKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IGxwZGNiLT5CYXVkUmF0ZTsKCWVsc2UgaWYobHBkY2ItPkJhdWRSYXRlPT0xMTUyMDApCgkJCWxwZGNiMTYtPkJhdWRSYXRlID0gNTc2MDE7CgllbHNlIHsKCQlXQVJOKCJCYXVkIHJhdGUgY2FuJ3QgYmUgY29udmVydGVkXG4iKTsKCQlscGRjYjE2LT5CYXVkUmF0ZSA9IDU3NjAxOwoJfQoJbHBkY2IxNi0+Qnl0ZVNpemUgPSBscGRjYi0+Qnl0ZVNpemU7CglscGRjYjE2LT5mUGFyaXR5ID0gbHBkY2ItPmZQYXJpdHk7CglscGRjYjE2LT5QYXJpdHkgPSBscGRjYi0+UGFyaXR5OwoJbHBkY2IxNi0+U3RvcEJpdHMgPSBscGRjYi0+U3RvcEJpdHM7CgoJbHBkY2IxNi0+UmxzVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Q3RzVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+RHNyVGltZW91dCA9IDUwOwoJbHBkY2IxNi0+Zk51bGwgPSAwOwoJbHBkY2IxNi0+ZkNoRXZ0ID0gMDsKCWxwZGNiMTYtPmZCaW5hcnkgPSAxOwoKCWxwZGNiMTYtPmZEdHJmbG93ID0gKGxwZGNiLT5mRHRyQ29udHJvbD09RFRSX0NPTlRST0xfSEFORFNIQUtFKTsKCWxwZGNiMTYtPmZSdHNmbG93ID0gKGxwZGNiLT5mUnRzQ29udHJvbD09UlRTX0NPTlRST0xfSEFORFNIQUtFKTsKCWxwZGNiMTYtPmZPdXR4Q3RzRmxvdyA9IGxwZGNiLT5mT3V0eEN0c0Zsb3c7CglscGRjYjE2LT5mT3V0eERzckZsb3cgPSBscGRjYi0+Zk91dHhEc3JGbG93OwoJbHBkY2IxNi0+ZkR0ckRpc2FibGUgPSAobHBkY2ItPmZEdHJDb250cm9sPT1EVFJfQ09OVFJPTF9ESVNBQkxFKTsKCglscGRjYjE2LT5mSW5YID0gbHBkY2ItPmZJblg7CgoJbHBkY2IxNi0+Zk91dFggPSBscGRjYi0+Zk91dFg7Ci8qCglscGRjYjE2LT5Yb25DaGFyID0KCWxwZGNiMTYtPlhvZmZDaGFyID0KICovCglscGRjYjE2LT5Yb25MaW0gPSAxMDsKCWxwZGNiMTYtPlhvZmZMaW0gPSAxMDsKCglyZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQgkJKFVTRVIuMjEzKQogKgogKiBBY2NvcmRpbmcgdG8gdGhlIEVDTUEtMjM0ICgzNjguMykgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEZBTFNFIG9uCiAqIHN1Y2Nlc3MsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiAtMS4KICovCklOVDE2IFdJTkFQSSBCdWlsZENvbW1EQ0IxNihMUENTVFIgZGV2aWNlLCBMUERDQjE2IGxwZGNiKQp7CgkvKiAiQ09NMTo5NixuLDgsMSIJKi8KCS8qICAwMTIzNDUJCSovCglpbnQgcG9ydDsKCURDQiBkY2I7CgoJVFJBQ0UoIiglcyksIHB0ciAlcFxuIiwgZGV2aWNlLCBscGRjYik7CgoJaWYgKHN0cm5jYXNlY21wKGRldmljZSwiQ09NIiwzKSkKCQlyZXR1cm4gLTE7Cglwb3J0ID0gZGV2aWNlWzNdIC0gJzAnOwoKCWlmIChwb3J0LS0gPT0gMCkgewoJCUVSUigiQlVHICEgQ09NMCBjYW4ndCBleGlzdCFcbiIpOwoJCXJldHVybiAtMTsKCX0KCgltZW1zZXQobHBkY2IsIDAsIHNpemVvZihEQ0IxNikpOyAvKiBpbml0aWFsaXplICovCgoJbHBkY2ItPklkID0gcG9ydDsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YoRENCKTsKCglpZiAoc3RyY2hyKGRldmljZSwnPScpKSAvKiBibG9jayBuZXcgc3R5bGUgKi8KCQlyZXR1cm4gLTE7CgoJaWYoIUJ1aWxkQ29tbURDQkEoZGV2aWNlLCZkY2IpKQoJCXJldHVybiAtMTsKCglyZXR1cm4gQ09NTTE2X0RDQnRvRENCMTYoJmRjYiwgbHBkY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJT3BlbkNvbW0JCShVU0VSLjIwMCkKICovCklOVDE2IFdJTkFQSSBPcGVuQ29tbTE2KExQQ1NUUiBkZXZpY2UsVUlOVDE2IGNiSW5RdWV1ZSxVSU5UMTYgY2JPdXRRdWV1ZSkKewoJaW50IHBvcnQ7CglIQU5ETEUgaGFuZGxlOwoKICAgIAlUUkFDRSgiJXMsICVkLCAlZFxuIiwgZGV2aWNlLCBjYkluUXVldWUsIGNiT3V0UXVldWUpOwoKCWlmIChzdHJsZW4oZGV2aWNlKSA8IDQpCgkgICByZXR1cm4gSUVfQkFESUQ7CgoJcG9ydCA9IGRldmljZVszXSAtICcwJzsKCglpZiAocG9ydC0tID09IDApCgkJRVJSKCJCVUcgISBDT00wIG9yIExQVDAgZG9uJ3QgZXhpc3QgIVxuIik7CgoJaWYgKCFzdHJuY2FzZWNtcChkZXZpY2UsIkNPTSIsMykpCiAgICAgICAgewoJCWlmIChDT01bcG9ydF0uaGFuZGxlKQoJCQlyZXR1cm4gSUVfT1BFTjsKCgkJaGFuZGxlID0gQ3JlYXRlRmlsZUEoZGV2aWNlLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwKCQkJRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwgTlVMTCwgQ1JFQVRFX0FMV0FZUywKCQkJRklMRV9GTEFHX09WRVJMQVBQRUR8RklMRV9GTEFHX05PX0JVRkZFUklORywgMCApOwoJCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKCQkJcmV0dXJuIElFX0hBUkRXQVJFOwoJCX0gZWxzZSB7CgkJCW1lbXNldChDT01bcG9ydF0udW5rbm93biwgMCwgc2l6ZW9mKENPTVtwb3J0XS51bmtub3duKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTVtwb3J0XS5zZWdfdW5rbm93biA9IDA7CgkJCUNPTVtwb3J0XS5oYW5kbGUgPSBoYW5kbGU7CgkJCUNPTVtwb3J0XS5jb21tZXJyb3IgPSAwOwoJCQlDT01bcG9ydF0uZXZlbnRtYXNrID0gMDsKCQkJQ09NW3BvcnRdLmV2dGNoYXIgPSAwOyAvKiBGSVhNRTogZGVmYXVsdD8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0ZXJtaW5hbCBzdGF0ZSAqLwoJCQlHZXRDb21tU3RhdGUxNihwb3J0LCZDT01bcG9ydF0uZGNiKTsKCQkJLyogaW5pdCBwcmlvcml0eSBjaGFyYWN0ZXJzICovCgkJCUNPTVtwb3J0XS51bmdldCA9IC0xOwoJCQlDT01bcG9ydF0ueG1pdCA9IC0xOwoJCQkvKiBhbGxvY2F0ZSBidWZmZXJzICovCgkJCUNPTVtwb3J0XS5pYnVmX3NpemUgPSBjYkluUXVldWU7CgkJCUNPTVtwb3J0XS5pYnVmX2hlYWQgPSBDT01bcG9ydF0uaWJ1Zl90YWlsID0gMDsKCQkJQ09NW3BvcnRdLm9idWZfc2l6ZSA9IGNiT3V0UXVldWU7CgkJCUNPTVtwb3J0XS5vYnVmX2hlYWQgPSBDT01bcG9ydF0ub2J1Zl90YWlsID0gMDsKCgkJCUNPTVtwb3J0XS5pbmJ1ZiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjYkluUXVldWUpOwoJCQlpZiAoQ09NW3BvcnRdLmluYnVmKSB7CgkJCSAgQ09NW3BvcnRdLm91dGJ1ZiA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2JPdXRRdWV1ZSk7CgkJCSAgaWYgKCFDT01bcG9ydF0ub3V0YnVmKQoJCQkgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIENPTVtwb3J0XS5pbmJ1Zik7CgkJCX0gZWxzZSBDT01bcG9ydF0ub3V0YnVmID0gTlVMTDsKCQkJaWYgKCFDT01bcG9ydF0ub3V0YnVmKSB7CgkJCSAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KCQkJICBDbG9zZUhhbmRsZShDT01bcG9ydF0uaGFuZGxlKTsKCQkJICBFUlIoIm91dCBvZiBtZW1vcnlcbiIpOwoJCQkgIHJldHVybiBJRV9NRU1PUlk7CgkJCX0KCgkJCVplcm9NZW1vcnkoJkNPTVtwb3J0XS5yZWFkX292LHNpemVvZiAoT1ZFUkxBUFBFRCkpOwoJCQlaZXJvTWVtb3J5KCZDT01bcG9ydF0ud3JpdGVfb3Ysc2l6ZW9mIChPVkVSTEFQUEVEKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb21tX3dhaXRyZWFkKCAmQ09NW3BvcnRdICk7CgkJCVVTRVIxNl9BbGVydGFibGVXYWl0Kys7CgoJCQlyZXR1cm4gcG9ydDsKCQl9Cgl9CgllbHNlCglpZiAoIXN0cm5jYXNlY21wKGRldmljZSwiTFBUIiwzKSkgewoKCQlpZiAoTFBUW3BvcnRdLmhhbmRsZSkKCQkJcmV0dXJuIElFX09QRU47CgoJCWhhbmRsZSA9IENyZWF0ZUZpbGVBKGRldmljZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsCgkJCUZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsIENSRUFURV9BTFdBWVMsIDAsIDAgKTsKCQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CgkJCXJldHVybiBJRV9IQVJEV0FSRTsKCQl9IGVsc2UgewoJCQlMUFRbcG9ydF0uaGFuZGxlID0gaGFuZGxlOwoJCQlMUFRbcG9ydF0uY29tbWVycm9yID0gMDsKCQkJTFBUW3BvcnRdLmV2ZW50bWFzayA9IDA7CgkJCXJldHVybiBwb3J0fEZMQUdfTFBUOwoJCX0KCX0KCXJldHVybiBJRV9CQURJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNsb3NlQ29tbQkJKFVTRVIuMjA3KQogKi8KSU5UMTYgV0lOQVBJIENsb3NlQ29tbTE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkPSVkXG4iLCBjaWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBjaWQ9JWQgZm91bmQhXG4iLCBjaWQpOwoJCXJldHVybiAtMTsKCX0KCWlmICghKGNpZCZGTEFHX0xQVCkpIHsKCQkvKiBDT00gcG9ydCAqLwogICAgICAgICAgICAgICAgVW5NYXBMUyggQ09NW2NpZF0uc2VnX3Vua25vd24gKTsKCQlVU0VSMTZfQWxlcnRhYmxlV2FpdC0tOwoJCUNhbmNlbElvKHB0ci0+aGFuZGxlKTsKCgkJLyogZnJlZSBidWZmZXJzICovCgkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHB0ci0+b3V0YnVmKTsKCQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcHRyLT5pbmJ1Zik7CgoJCS8qIHJlc2V0IG1vZGVtIGxpbmVzICovCgkJU2V0Q29tbVN0YXRlMTYoJkNPTVtjaWRdLmRjYik7Cgl9CgoJaWYgKCFDbG9zZUhhbmRsZShwdHItPmhhbmRsZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJLyogRklYTUU6IHNob3VsZCB3ZSBjbGVhciBwdHItPmhhbmRsZSBoZXJlPyAqLwoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcHRyLT5jb21tZXJyb3IgPSAwOwoJCXB0ci0+aGFuZGxlID0gMDsKCQlyZXR1cm4gMDsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNldENvbW1CcmVhawkJKFVTRVIuMjEwKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1CcmVhazE2KElOVDE2IGNpZCkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXB0ci0+c3VzcGVuZGVkID0gMTsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJQ2xlYXJDb21tQnJlYWsJKFVTRVIuMjExKQogKi8KSU5UMTYgV0lOQVBJIENsZWFyQ29tbUJyZWFrMTYoSU5UMTYgY2lkKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWRcbiIsIGNpZCk7CglpZiAoIShwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkpIHsKCQlGSVhNRSgibm8gY2lkPSVkIGZvdW5kIVxuIiwgY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnN1c3BlbmRlZCA9IDA7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUVzY2FwZUNvbW1GdW5jdGlvbgkoVVNFUi4yMTQpCiAqLwpMT05HIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24xNihVSU5UMTYgY2lkLFVJTlQxNiBuRnVuY3Rpb24pCnsKCXN0cnVjdCAgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQ9JWQsIGZ1bmN0aW9uPSVkXG4iLCBjaWQsIG5GdW5jdGlvbik7CgoJc3dpdGNoKG5GdW5jdGlvbikgewoJY2FzZSBHRVRNQVhDT006CgkgICAgICAgIFRSQUNFKCJHRVRNQVhDT01cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDQ7ICAvKiBGSVhNRSAqLwoKCWNhc2UgR0VUTUFYTFBUOgoJCVRSQUNFKCJHRVRNQVhMUFRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfTFBUICsgMzsgIC8qIEZJWE1FICovCgoJY2FzZSBHRVRCQVNFSVJROgoJCVRSQUNFKCJHRVRCQVNFSVJRXG4iKTsKCQkvKiBGSVhNRTogdXNlIHRhYmxlcyAqLwoJCS8qIGp1c3QgZmFrZSBzb21ldGhpbmcgZm9yIG5vdyAqLwoJCWlmIChjaWQgJiBGTEFHX0xQVCkgewoJCQkvKiBMUFQxOiBpcnEgNywgTFBUMjogaXJxIDUgKi8KCQkJcmV0dXJuIChjaWQgJiAweDdmKSA/IDUgOiA3OwoJCX0gZWxzZSB7CgkJCS8qIENPTTE6IGlycSA0LCBDT00yOiBpcnEgMywKCQkJICAgQ09NMzogaXJxIDQsIENPTTQ6IGlycSAzICovCgkJCXJldHVybiA0IC0gKGNpZCAmIDEpOwoJCX0KCX0KCglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXN3aXRjaCAobkZ1bmN0aW9uKSB7CgljYXNlIFJFU0VUREVWOgoJY2FzZSBDTFJEVFI6CgljYXNlIENMUlJUUzoKCWNhc2UgU0VURFRSOgoJY2FzZSBTRVRSVFM6CgljYXNlIFNFVFhPRkY6CgljYXNlIFNFVFhPTjoKCQlpZihFc2NhcGVDb21tRnVuY3Rpb24ocHRyLT5oYW5kbGUsbkZ1bmN0aW9uKSkKCQkJcmV0dXJuIDA7CgkJZWxzZSB7CgkJCXB0ci0+Y29tbWVycm9yID0gV2luRXJyb3IoKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgljYXNlIENMUkJSRUFLOgoJY2FzZSBTRVRCUkVBSzoKCWRlZmF1bHQ6CgkJV0FSTigiKGNpZD0lZCxuRnVuY3Rpb249JWQpOiBVbmtub3duIGZ1bmN0aW9uXG4iLAoJCQljaWQsIG5GdW5jdGlvbik7Cgl9CglyZXR1cm4gLTE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglGbHVzaENvbW0JKFVTRVIuMjE1KQogKi8KSU5UMTYgV0lOQVBJIEZsdXNoQ29tbTE2KElOVDE2IGNpZCxJTlQxNiBmblF1ZXVlKQp7CglEV09SRCBxdWV1ZTsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZD0lZCwgcXVldWU9JWRcbiIsIGNpZCwgZm5RdWV1ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGNpZD0lZCBmb3VuZCFcbiIsIGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJc3dpdGNoIChmblF1ZXVlKSB7CgljYXNlIDA6CgkJcXVldWUgPSBQVVJHRV9UWEFCT1JUOwoJCXB0ci0+b2J1Zl90YWlsID0gcHRyLT5vYnVmX2hlYWQ7CgkJYnJlYWs7CgljYXNlIDE6CgkJcXVldWUgPSBQVVJHRV9SWEFCT1JUOwoJCXB0ci0+aWJ1Zl9oZWFkID0gcHRyLT5pYnVmX3RhaWw7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVdBUk4oIihjaWQ9JWQsZm5RdWV1ZT0lZCk6VW5rbm93biBxdWV1ZVxuIiwKCQkgICAgICAgICAgICBjaWQsIGZuUXVldWUpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIVB1cmdlQ29tbShwdHItPmhhbmRsZSxxdWV1ZSkpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tRXJyb3IJKFVTRVIuMjAzKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1FcnJvcjE2KElOVDE2IGNpZCxMUENPTVNUQVQxNiBscFN0YXQpCnsKCWludAkJdGVtcGVycm9yOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CgoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIENFX01PREU7CiAgICAgICAgfQogICAgICAgIHN0b2wgPSAodW5zaWduZWQgY2hhciAqKUNPTVtjaWRdLnVua25vd24gKyBDT01NX01TUl9PRkZTRVQ7CglDT01NX01TUlVwZGF0ZSggcHRyLT5oYW5kbGUsIHN0b2wgKTsKCiAgICAgICBpZiAobHBTdGF0KSB7CiAgICAgICAgICAgICAgIGxwU3RhdC0+c3RhdHVzID0gMDsKCiAgICAgICAgICAgICAgIGlmIChjb21tX2luYnVmKHB0cikgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICBTbGVlcEV4KDEsVFJVRSk7CgoJCWxwU3RhdC0+Y2JPdXRRdWUgPSBjb21tX291dGJ1ZihwdHIpOwoJCWxwU3RhdC0+Y2JJblF1ZSA9IGNvbW1faW5idWYocHRyKTsKCiAgICAJCVRSQUNFKCJjaWQgJWQsIGVycm9yICVkLCBzdGF0ICVkIGluICVkIG91dCAlZCwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCBscFN0YXQtPnN0YXR1cywgbHBTdGF0LT5jYkluUXVlLAoJCQkgICAgIGxwU3RhdC0+Y2JPdXRRdWUsICpzdG9sKTsKCX0KCWVsc2UKCQlUUkFDRSgiY2lkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTEwgc3RvbCAleFxuIiwKCQkJICAgICBjaWQsIHB0ci0+Y29tbWVycm9yLCAqc3RvbCk7CgoJLyogUmV0dXJuIGFueSBlcnJvcnMgYW5kIGNsZWFyIGl0ICovCgl0ZW1wZXJyb3IgPSBwdHItPmNvbW1lcnJvcjsKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybih0ZW1wZXJyb3IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbUV2ZW50TWFzawkoVVNFUi4yMDgpCiAqLwpTRUdQVFIgV0lOQVBJIFNldENvbW1FdmVudE1hc2sxNihJTlQxNiBjaWQsVUlOVDE2IGZ1RXZ0TWFzaykKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0b2w7CgogICAgCVRSQUNFKCJjaWQgJWQsbWFzayAlZFxuIixjaWQsZnVFdnRNYXNrKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkgICAgcmV0dXJuIChTRUdQVFIpTlVMTDsKCX0KCglwdHItPmV2ZW50bWFzayA9IGZ1RXZ0TWFzazsKCiAgICAgICAgaWYgKGNpZCZGTEFHX0xQVCkgewogICAgICAgICAgICBXQVJOKCIgY2lkICVkIG5vdCBjb21tIHBvcnRcbiIsY2lkKTsKICAgICAgICAgICAgcmV0dXJuIChTRUdQVFIpTlVMTDsKICAgICAgICB9CiAgICAgICAgLyogaXQncyBhIENPTSBwb3J0ID8gLT4gbW9kaWZ5IGZsYWdzICovCiAgICAgICAgc3RvbCA9ICh1bnNpZ25lZCBjaGFyICopQ09NW2NpZF0udW5rbm93biArIENPTU1fTVNSX09GRlNFVDsKCUNPTU1fTVNSVXBkYXRlKCBwdHItPmhhbmRsZSwgc3RvbCApOwoKCVRSQUNFKCIgbW9kZW0gZGNkIGNvbnN0cnVjdCAleFxuIiwqc3RvbCk7CiAgICAgICAgaWYgKCFDT01bY2lkXS5zZWdfdW5rbm93bikgQ09NW2NpZF0uc2VnX3Vua25vd24gPSBNYXBMUyggQ09NW2NpZF0udW5rbm93biApOwogICAgICAgIHJldHVybiBDT01bY2lkXS5zZWdfdW5rbm93bjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1FdmVudE1hc2sJKFVTRVIuMjA5KQogKi8KVUlOVDE2IFdJTkFQSSBHZXRDb21tRXZlbnRNYXNrMTYoSU5UMTYgY2lkLFVJTlQxNiBmbkV2dENsZWFyKQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CglXT1JEIGV2ZW50czsKCiAgICAJVFJBQ0UoImNpZCAlZCwgbWFzayAlZFxuIiwgY2lkLCBmbkV2dENsZWFyKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkgICAgcmV0dXJuIDA7Cgl9CgogICAgICAgIGlmIChjaWQmRkxBR19MUFQpIHsKICAgICAgICAgICAgV0FSTigiIGNpZCAlZCBub3QgY29tbSBwb3J0XG4iLGNpZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCglldmVudHMgPSAqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSAmIGZuRXZ0Q2xlYXI7CgkqKFdPUkQqKShDT01bY2lkXS51bmtub3duKSAmPSB+Zm5FdnRDbGVhcjsKCXJldHVybiBldmVudHM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUJKFVTRVIuMjAxKQogKi8KSU5UMTYgV0lOQVBJIFNldENvbW1TdGF0ZTE2KExQRENCMTYgbHBkY2IpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCURDQiBkY2I7CgogICAgCVRSQUNFKCJjaWQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChscGRjYi0+SWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixscGRjYi0+SWQpOwoJCXJldHVybiAtMTsKCX0KCgltZW1zZXQoJmRjYiwwLHNpemVvZihkY2IpKTsKCWRjYi5EQ0JsZW5ndGggPSBzaXplb2YoZGNiKTsKCgkvKgoJICogYWNjb3JkaW5nIHRvIE1TRE4sIHdlIHNob3VsZCBmaXJzdCBpbnRlcnByZXQgbHBkY2ItPkJhdWRSYXRlIGFzIGZvbGxvd3M6CgkgKiAxLiBpZiB0aGUgYmF1ZCByYXRlIGlzIGEgQ0JSIGNvbnN0YW50LCBpbnRlcnByZXQgaXQuCgkgKiAyLiBpZiBpdCBpcyBncmVhdGVyIHRoYW4gNTc2MDAsIHRoZSBiYXVkIHJhdGUgaXMgMTE1MjAwCgkgKiAzLiB1c2UgdGhlIGFjdHVhbCBiYXVkcmF0ZQoJICogc3RlcHMgMiBhbmQgMyBhcmUgZXF1aXZpbGVudCB0byAxNjU1MCBiYXVkcmF0ZSBkaXZpc29yID0gMTE1MjAwL0JhdWRSYXRlCgkgKiBzZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL3ExMDgvOS8yOC5hc3AKCSAqLwoJc3dpdGNoKGxwZGNiLT5CYXVkUmF0ZSkKCXsKCWNhc2UgQ0JSXzExMDogICAgZGNiLkJhdWRSYXRlID0gMTEwOyAgICBicmVhazsKCWNhc2UgQ0JSXzMwMDogICAgZGNiLkJhdWRSYXRlID0gMzAwOyAgICBicmVhazsKCWNhc2UgQ0JSXzYwMDogICAgZGNiLkJhdWRSYXRlID0gNjAwOyAgICBicmVhazsKCWNhc2UgQ0JSXzEyMDA6ICAgZGNiLkJhdWRSYXRlID0gMTIwMDsgICBicmVhazsKCWNhc2UgQ0JSXzI0MDA6ICAgZGNiLkJhdWRSYXRlID0gMjQwMDsgICBicmVhazsKCWNhc2UgQ0JSXzQ4MDA6ICAgZGNiLkJhdWRSYXRlID0gNDgwMDsgICBicmVhazsKCWNhc2UgQ0JSXzk2MDA6ICAgZGNiLkJhdWRSYXRlID0gOTYwMDsgICBicmVhazsKCWNhc2UgQ0JSXzE0NDAwOiAgZGNiLkJhdWRSYXRlID0gMTQ0MDA7ICBicmVhazsKCWNhc2UgQ0JSXzE5MjAwOiAgZGNiLkJhdWRSYXRlID0gMTkyMDA7ICBicmVhazsKCWNhc2UgQ0JSXzM4NDAwOiAgZGNiLkJhdWRSYXRlID0gMzg0MDA7ICBicmVhazsKCWNhc2UgQ0JSXzU2MDAwOiAgZGNiLkJhdWRSYXRlID0gNTYwMDA7ICBicmVhazsKCWNhc2UgQ0JSXzEyODAwMDogZGNiLkJhdWRSYXRlID0gMTI4MDAwOyBicmVhazsKCWNhc2UgQ0JSXzI1NjAwMDogZGNiLkJhdWRSYXRlID0gMjU2MDAwOyBicmVhazsKCWRlZmF1bHQ6CgkJaWYobHBkY2ItPkJhdWRSYXRlPjU3NjAwKQoJCWRjYi5CYXVkUmF0ZSA9IDExNTIwMDsKICAgICAgICBlbHNlCgkJZGNiLkJhdWRSYXRlID0gbHBkY2ItPkJhdWRSYXRlOwogCX0KCiAgICAgICAgZGNiLkJ5dGVTaXplPWxwZGNiLT5CeXRlU2l6ZTsKICAgICAgICBkY2IuU3RvcEJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKCWRjYi5mUGFyaXR5PWxwZGNiLT5mUGFyaXR5OwoJZGNiLlBhcml0eT1scGRjYi0+UGFyaXR5OwoKCWRjYi5mT3V0eEN0c0Zsb3cgPSBscGRjYi0+Zk91dHhDdHNGbG93OwoKCWlmIChscGRjYi0+ZkR0cmZsb3cgfHwgbHBkY2ItPmZSdHNmbG93KQoJCWRjYi5mUnRzQ29udHJvbCA9IFRSVUU7CgoJaWYgKGxwZGNiLT5mRHRyRGlzYWJsZSkKCQlkY2IuZkR0ckNvbnRyb2wgPSBUUlVFOwoKCXB0ci0+ZXZ0Y2hhciA9IGxwZGNiLT5FdnRDaGFyOwoKCWRjYi5mSW5YID0gbHBkY2ItPmZJblg7CglkY2IuZk91dFggPSBscGRjYi0+Zk91dFg7CgoJaWYgKCFTZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfSBlbHNlIHsKCQlwdHItPmNvbW1lcnJvciA9IDA7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKFVTRVIuMjAyKQogKi8KSU5UMTYgV0lOQVBJIEdldENvbW1TdGF0ZTE2KElOVDE2IGNpZCwgTFBEQ0IxNiBscGRjYikKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoJRENCIGRjYjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwXG4iLCBjaWQsIGxwZGNiKTsKCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGNpZCkpID09IE5VTEwpIHsKCQlGSVhNRSgibm8gaGFuZGxlIGZvciBjaWQgPSAlMHghXG4iLGNpZCk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKCFHZXRDb21tU3RhdGUocHRyLT5oYW5kbGUsJmRjYikpIHsKCQlwdHItPmNvbW1lcnJvciA9IFdpbkVycm9yKCk7CgkJcmV0dXJuIC0xOwoJfQoKCWxwZGNiLT5JZCA9IGNpZDsKCglDT01NMTZfRENCdG9EQ0IxNigmZGNiLGxwZGNiKTsKCglscGRjYi0+RXZ0Q2hhciA9IHB0ci0+ZXZ0Y2hhcjsKCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKFVTRVIuMjA2KQogKi8KSU5UMTYgV0lOQVBJIFRyYW5zbWl0Q29tbUNoYXIxNihJTlQxNiBjaWQsQ0hBUiBjaFRyYW5zbWl0KQp7CglzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CgogICAgCVRSQUNFKCJjaWQgJWQsIGRhdGEgJWRcbiIsIGNpZCwgY2hUcmFuc21pdCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT54bWl0ID49IDApIHsKCSAgLyogY2hhcmFjdGVyIGFscmVhZHkgcXVldWVkICovCgkgIC8qIEZJWE1FOiB3aGljaCBlcnJvciB3b3VsZCBXaW5kb3dzIHJldHVybj8gKi8KCSAgcHRyLT5jb21tZXJyb3IgPSBDRV9UWEZVTEw7CgkgIHJldHVybiAtMTsKCX0KCglpZiAocHRyLT5vYnVmX2hlYWQgPT0gcHRyLT5vYnVmX3RhaWwpIHsKCSAgLyogdHJhbnNtaXQgcXVldWUgZW1wdHksIHRyeSB0byB0cmFuc21pdCBkaXJlY3RseSAqLwoJICBpZigxIT1DT01NMTZfV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCAmY2hUcmFuc21pdCwgMSkpCgkgIHsKCSAgICAvKiBkaWRuJ3Qgd29yaywgcXVldWUgaXQgKi8KCSAgICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICAgIGNvbW1fd2FpdHdyaXRlKHB0cik7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIGRhdGEgaW4gcXVldWUsIGxldCB0aGlzIGNoYXIgYmUgdHJhbnNtaXR0ZWQgbmV4dCAqLwoJICBwdHItPnhtaXQgPSBjaFRyYW5zbWl0OwoJICBjb21tX3dhaXR3cml0ZShwdHIpOwoJfQoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVW5nZXRDb21tQ2hhcgkoVVNFUi4yMTIpCiAqLwpJTlQxNiBXSU5BUEkgVW5nZXRDb21tQ2hhcjE2KElOVDE2IGNpZCxDSEFSIGNoVW5nZXQpCnsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCiAgICAJVFJBQ0UoImNpZCAlZCAoY2hhciAlZClcbiIsIGNpZCwgY2hVbmdldCk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT51bmdldD49MCkgewoJICAvKiBjaGFyYWN0ZXIgYWxyZWFkeSBxdWV1ZWQgKi8KCSAgLyogRklYTUU6IHdoaWNoIGVycm9yIHdvdWxkIFdpbmRvd3MgcmV0dXJuPyAqLwoJICBwdHItPmNvbW1lcnJvciA9IENFX1JYT1ZFUjsKCSAgcmV0dXJuIC0xOwoJfQoKCXB0ci0+dW5nZXQgPSBjaFVuZ2V0OwoKCXB0ci0+Y29tbWVycm9yID0gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJUmVhZENvbW0JKFVTRVIuMjA0KQogKi8KSU5UMTYgV0lOQVBJIFJlYWRDb21tMTYoSU5UMTYgY2lkLExQU1RSIGxwdkJ1ZixJTlQxNiBjYlJlYWQpCnsKCWludCBzdGF0dXMsIGxlbmd0aDsKCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKCUxQU1RSIG9yZ0J1ZiA9IGxwdkJ1ZjsKCiAgICAJVFJBQ0UoImNpZCAlZCwgcHRyICVwLCBsZW5ndGggJWRcbiIsIGNpZCwgbHB2QnVmLCBjYlJlYWQpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKHB0ci0+c3VzcGVuZGVkKSB7CgkJcHRyLT5jb21tZXJyb3IgPSBJRV9IQVJEV0FSRTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYoMD09Y29tbV9pbmJ1ZihwdHIpKQoJCVNsZWVwRXgoMSxUUlVFKTsKCgkvKiByZWFkIHVuZ2V0IGNoYXJhY3RlciAqLwoJaWYgKHB0ci0+dW5nZXQ+PTApIHsKCQkqbHB2QnVmKysgPSBwdHItPnVuZ2V0OwoJCXB0ci0+dW5nZXQgPSAtMTsKCgkJbGVuZ3RoID0gMTsKCX0gZWxzZQoJIAlsZW5ndGggPSAwOwoKCS8qIHJlYWQgZnJvbSByZWNlaXZlIGJ1ZmZlciAqLwoJd2hpbGUgKGxlbmd0aCA8IGNiUmVhZCkgewoJICBzdGF0dXMgPSAoKHB0ci0+aWJ1Zl9oZWFkIDwgcHRyLT5pYnVmX3RhaWwpID8KCQkgICAgcHRyLT5pYnVmX3NpemUgOiBwdHItPmlidWZfaGVhZCkgLSBwdHItPmlidWZfdGFpbDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiUmVhZCAtIGxlbmd0aCkgPCBzdGF0dXMpCgkgICAgc3RhdHVzID0gY2JSZWFkIC0gbGVuZ3RoOwoKCSAgbWVtY3B5KGxwdkJ1ZiwgcHRyLT5pbmJ1ZiArIHB0ci0+aWJ1Zl90YWlsLCBzdGF0dXMpOwoJICBwdHItPmlidWZfdGFpbCArPSBzdGF0dXM7CgkgIGlmIChwdHItPmlidWZfdGFpbCA+PSBwdHItPmlidWZfc2l6ZSkKCSAgICBwdHItPmlidWZfdGFpbCA9IDA7CgkgIGxwdkJ1ZiArPSBzdGF0dXM7CgkgIGxlbmd0aCArPSBzdGF0dXM7Cgl9CgoJVFJBQ0UoIiVzXG4iLCBkZWJ1Z3N0cl9hbiggb3JnQnVmLCBsZW5ndGggKSk7CglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJV3JpdGVDb21tCShVU0VSLjIwNSkKICovCklOVDE2IFdJTkFQSSBXcml0ZUNvbW0xNihJTlQxNiBjaWQsIExQU1RSIGxwdkJ1ZiwgSU5UMTYgY2JXcml0ZSkKewoJaW50IHN0YXR1cywgbGVuZ3RoOwoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKICAgIAlUUkFDRSgiY2lkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwKCQljaWQsIGxwdkJ1ZiwgY2JXcml0ZSk7CglpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChjaWQpKSA9PSBOVUxMKSB7CgkJRklYTUUoIm5vIGhhbmRsZSBmb3IgY2lkID0gJTB4IVxuIixjaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAocHRyLT5zdXNwZW5kZWQpIHsKCQlwdHItPmNvbW1lcnJvciA9IElFX0hBUkRXQVJFOwoJCXJldHVybiAtMTsKCX0KCglUUkFDRSgiJXNcbiIsIGRlYnVnc3RyX2FuKCBscHZCdWYsIGNiV3JpdGUgKSk7CgoJbGVuZ3RoID0gMDsKCXdoaWxlIChsZW5ndGggPCBjYldyaXRlKSB7CgkgIGlmICgocHRyLT5vYnVmX2hlYWQgPT0gcHRyLT5vYnVmX3RhaWwpICYmIChwdHItPnhtaXQgPCAwKSkgewoJICAgIC8qIG5vIGRhdGEgcXVldWVkLCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgKi8KCSAgICBzdGF0dXMgPSBDT01NMTZfV3JpdGVGaWxlKHB0ci0+aGFuZGxlLCBscHZCdWYsIGNiV3JpdGUgLSBsZW5ndGgpOwoJICAgIGlmIChzdGF0dXMgPiAwKSB7CgkgICAgICBscHZCdWYgKz0gc3RhdHVzOwoJICAgICAgbGVuZ3RoICs9IHN0YXR1czsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgfQoJICAvKiBjYW4ndCB3cml0ZSBkaXJlY3RseSwgcHV0IGludG8gdHJhbnNtaXQgYnVmZmVyICovCgkgIHN0YXR1cyA9ICgocHRyLT5vYnVmX3RhaWwgPiBwdHItPm9idWZfaGVhZCkgPwoJCSAgICAocHRyLT5vYnVmX3RhaWwtMSkgOiBwdHItPm9idWZfc2l6ZSkgLSBwdHItPm9idWZfaGVhZDsKCSAgaWYgKCFzdGF0dXMpIGJyZWFrOwoJICBpZiAoKGNiV3JpdGUgLSBsZW5ndGgpIDwgc3RhdHVzKQoJICAgIHN0YXR1cyA9IGNiV3JpdGUgLSBsZW5ndGg7CgkgIG1lbWNweShscHZCdWYsIHB0ci0+b3V0YnVmICsgcHRyLT5vYnVmX2hlYWQsIHN0YXR1cyk7CgkgIHB0ci0+b2J1Zl9oZWFkICs9IHN0YXR1czsKCSAgaWYgKHB0ci0+b2J1Zl9oZWFkID49IHB0ci0+b2J1Zl9zaXplKQoJICAgIHB0ci0+b2J1Zl9oZWFkID0gMDsKCSAgbHB2QnVmICs9IHN0YXR1czsKCSAgbGVuZ3RoICs9IHN0YXR1czsKCSAgY29tbV93YWl0d3JpdGUocHRyKTsKCX0KCglwdHItPmNvbW1lcnJvciA9IDA7CglyZXR1cm4gbGVuZ3RoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24gICAoVVNFUi4yNDUpCiAqLwpCT09MMTYgV0lOQVBJIEVuYWJsZUNvbW1Ob3RpZmljYXRpb24xNiggSU5UMTYgY2lkLCBIV05EMTYgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjYldyaXRlTm90aWZ5LCBJTlQxNiBjYk91dFF1ZXVlICkKewoJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwoKCVRSQUNFKCIoJWQsICV4LCAlZCwgJWQpXG4iLCBjaWQsIGh3bmQsIGNiV3JpdGVOb3RpZnksIGNiT3V0UXVldWUpOwoJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoY2lkKSkgPT0gTlVMTCkgewoJCUZJWE1FKCJubyBoYW5kbGUgZm9yIGNpZCA9ICUweCFcbiIsY2lkKTsKCQlyZXR1cm4gLTE7Cgl9CglwdHItPnduZCA9IFdJTl9IYW5kbGUzMiggaHduZCApOwoJcHRyLT5uX3JlYWQgPSBjYldyaXRlTm90aWZ5OwoJcHRyLT5uX3dyaXRlID0gY2JPdXRRdWV1ZTsKCXJldHVybiBUUlVFOwp9Cg==