LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw0eHhfaGFsX2RzaS5jCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICogQGJyaWVmICAgRFNJIEhBTCBtb2R1bGUgZHJpdmVyLgogICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZwogICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEU0kgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoZSBEU0kgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgoKICAgICgjKSBEZWNsYXJlIGEgRFNJX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSwgZm9yIGV4YW1wbGU6IERTSV9IYW5kbGVUeXBlRGVmICBoZHNpOwoKICAgICgjKSBJbml0aWFsaXplIHRoZSBEU0kgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9EU0lfTXNwSW5pdCgpIEFQSToKICAgICAgICAoIyMpIEVuYWJsZSB0aGUgRFNJIGludGVyZmFjZSBjbG9jawogICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcwogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERTSSBpbnRlcnJ1cHQgcHJpb3JpdHkKICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIERTSSBJUlEgQ2hhbm5lbAoKICAgICgjKSBJbml0aWFsaXplIHRoZSBEU0kgSG9zdCBwZXJpcGhlcmFsLCB0aGUgcmVxdWlyZWQgUExMIHBhcmFtZXRlcnMsIG51bWJlciBvZiBsYW5jZXMgYW5kCiAgICAgICAgVFggRXNjYXBlIGNsb2NrIGRpdmlkZXIgYnkgY2FsbGluZyB0aGUgSEFMX0RTSV9Jbml0KCkgQVBJIHdoaWNoIGNhbGxzIEhBTF9EU0lfTXNwSW5pdCgpLgoKICAgICoqKiBDb25maWd1cmF0aW9uICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgKCMpIFVzZSBIQUxfRFNJX0NvbmZpZ0FkYXB0ZWRDb21tYW5kTW9kZSgpIGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgRFNJIGhvc3QgaW4gYWRhcHRlZAogICAgICAgIGNvbW1hbmQgbW9kZS4KCiAgICAoIykgV2hlbiBvcGVyYXRpbmcgaW4gdmlkZW8gbW9kZSAsIHVzZSBIQUxfRFNJX0NvbmZpZ1ZpZGVvTW9kZSgpIHRvIGNvbmZpZ3VyZSB0aGUgRFNJIGhvc3QuCgogICAgKCMpIEZ1bmN0aW9uIEhBTF9EU0lfQ29uZmlnQ29tbWFuZCgpIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBEU0kgY29tbWFuZHMgYmVoYXZpb3IgaW4gbG93IHBvd2VyIG1vZGUuCgogICAgKCMpIFRvIGNvbmZpZ3VyZSB0aGUgRFNJIFBIWSB0aW1pbmdzIHBhcmFtZXRlcnMsIHVzZSBmdW5jdGlvbiBIQUxfRFNJX0NvbmZpZ1BoeVRpbWVyKCkuCgogICAgKCMpIFRoZSBEU0kgSG9zdCBjYW4gYmUgc3RhcnRlZC9zdG9wcGVkIHVzaW5nIHJlc3BlY3RpdmVseSBmdW5jdGlvbnMgSEFMX0RTSV9TdGFydCgpIGFuZCBIQUxfRFNJX1N0b3AoKS4KICAgICAgICBGdW5jdGlvbnMgSEFMX0RTSV9TaG9ydFdyaXRlKCksIEhBTF9EU0lfTG9uZ1dyaXRlKCkgYW5kIEhBTF9EU0lfUmVhZCgpIGFsbG93cyByZXNwZWN0aXZlbHkKICAgICAgICB0byB3cml0ZSBEU0kgc2hvcnQgcGFja2V0cywgbG9uZyBwYWNrZXRzIGFuZCB0byByZWFkIERTSSBwYWNrZXRzLgoKICAgICgjKSBUaGUgRFNJIEhvc3QgT2ZmZXJzIHR3byBMb3cgcG93ZXIgbW9kZXMgOgogICAgICAgICgrKykgTG93IFBvd2VyIE1vZGUgb24gZGF0YSBsYW5lcyBvbmx5OiBPbmx5IERTSSBkYXRhIGxhbmVzIGFyZSBzaHV0IGRvd24uCiAgICAgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIGVudGVyL2V4aXQgZnJvbSB0aGlzIG1vZGUgdXNpbmcgcmVzcGVjdGl2ZWx5IGZ1bmN0aW9ucyBIQUxfRFNJX0VudGVyVUxQTURhdGEoKQogICAgICAgICAgICBhbmQgSEFMX0RTSV9FeGl0VUxQTURhdGEoKQoKICAgICAgICAoKyspIExvdyBQb3dlciBNb2RlIG9uIGRhdGEgYW5kIGNsb2NrIGxhbmVzIDogQWxsIERTSSBsYW5lcyBhcmUgc2h1dCBkb3duIGluY2x1ZGluZyBkYXRhIGFuZCBjbG9jayBsYW5lcy4KICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gZW50ZXIvZXhpdCBmcm9tIHRoaXMgbW9kZSB1c2luZyByZXNwZWN0aXZlbHkgZnVuY3Rpb25zIEhBTF9EU0lfRW50ZXJVTFBNKCkKICAgICAgICAgICAgYW5kIEhBTF9EU0lfRXhpdFVMUE0oKQoKICAgICgjKSBUbyBjb250cm9sIERTSSBzdGF0ZSB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOiBIQUxfRFNJX0dldFN0YXRlKCkKCiAgICAqKiogRXJyb3IgbWFuYWdlbWVudCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgKCMpIFVzZXIgY2FuIHNlbGVjdCB0aGUgRFNJIGVycm9ycyB0byBiZSByZXBvcnRlZC9tb25pdG9yZWQgdXNpbmcgZnVuY3Rpb24gSEFMX0RTSV9Db25maWdFcnJvck1vbml0b3IoKQogICAgICAgIFdoZW4gYW4gZXJyb3Igb2NjdXJzLCB0aGUgY2FsbGJhY2sgSEFMX0RTSV9FcnJvckNhbGxiYWNrKCkgaXMgYXNzZXJ0ZWQgYW5kIHRoZW4gdXNlciBjYW4gcmV0cmlldmUKICAgICAgICB0aGUgZXJyb3IgY29kZSBieSBjYWxsaW5nIGZ1bmN0aW9uIEhBTF9EU0lfR2V0RXJyb3IoKQoKICAgICoqKiBEU0kgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBEU0kgSEFMIGRyaXZlci4KCiAgICAgICgrKSBfX0hBTF9EU0lfRU5BQkxFOiBFbmFibGUgdGhlIERTSSBIb3N0LgogICAgICAoKykgX19IQUxfRFNJX0RJU0FCTEU6IERpc2FibGUgdGhlIERTSSBIb3N0LgogICAgICAoKykgX19IQUxfRFNJX1dSQVBQRVJfRU5BQkxFOiBFbmFibGVzIHRoZSBEU0kgd3JhcHBlci4KICAgICAgKCspIF9fSEFMX0RTSV9XUkFQUEVSX0RJU0FCTEU6IERpc2FibGUgdGhlIERTSSB3cmFwcGVyLgogICAgICAoKykgX19IQUxfRFNJX1BMTF9FTkFCTEU6IEVuYWJsZXMgdGhlIERTSSBQTEwuCiAgICAgICgrKSBfX0hBTF9EU0lfUExMX0RJU0FCTEU6IERpc2FibGVzIHRoZSBEU0kgUExMLgogICAgICAoKykgX19IQUxfRFNJX1JFR19FTkFCTEU6IEVuYWJsZXMgdGhlIERTSSByZWd1bGF0b3IuCiAgICAgICgrKSBfX0hBTF9EU0lfUkVHX0RJU0FCTEU6IERpc2FibGVzIHRoZSBEU0kgcmVndWxhdG9yLgogICAgICAoKykgX19IQUxfRFNJX0dFVF9GTEFHOiBHZXQgdGhlIERTSSBwZW5kaW5nIGZsYWdzLgogICAgICAoKykgX19IQUxfRFNJX0NMRUFSX0ZMQUc6IENsZWFycyB0aGUgRFNJIHBlbmRpbmcgZmxhZ3MuCiAgICAgICgrKSBfX0hBTF9EU0lfRU5BQkxFX0lUOiBFbmFibGVzIHRoZSBzcGVjaWZpZWQgRFNJIGludGVycnVwdHMuCiAgICAgICgrKSBfX0hBTF9EU0lfRElTQUJMRV9JVDogRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBEU0kgaW50ZXJydXB0cy4KICAgICAgKCspIF9fSEFMX0RTSV9HRVRfSVRfU09VUkNFOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIERTSSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgoKICAgIFsuLl0KICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIERTSSBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MKCiAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX0RTSV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQogICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KICAgIFVzZSBGdW5jdGlvbiBIQUxfRFNJX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgoKICAgIFsuLl0KICAgIEZ1bmN0aW9uIEhBTF9EU0lfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAoKykgVGVhcmluZ0VmZmVjdENhbGxiYWNrIDogRFNJIFRlYXJpbmcgRWZmZWN0IENhbGxiYWNrLgogICAgICAoKykgRW5kT2ZSZWZyZXNoQ2FsbGJhY2sgIDogRFNJIEVuZCBPZiBSZWZyZXNoIENhbGxiYWNrLgogICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgIDogRFNJIEVycm9yIENhbGxiYWNrCiAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgOiBEU0kgTXNwSW5pdC4KICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICA6IERTSSBNc3BEZUluaXQuCiAgICBbLi5dCiAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIGNhbGxiYWNrIElECiAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgoKICAgIFsuLl0KICAgIFVzZSBmdW5jdGlvbiBIQUxfRFNJX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgIHdlYWsgZnVuY3Rpb24uCiAgICBIQUxfRFNJX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCiAgICBhbmQgdGhlIGNhbGxiYWNrIElELgogICAgWy4uXQogICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gcmVzZXQgZm9sbG93aW5nIGNhbGxiYWNrczoKICAgICAgKCspIFRlYXJpbmdFZmZlY3RDYWxsYmFjayA6IERTSSBUZWFyaW5nIEVmZmVjdCBDYWxsYmFjay4KICAgICAgKCspIEVuZE9mUmVmcmVzaENhbGxiYWNrICA6IERTSSBFbmQgT2YgUmVmcmVzaCBDYWxsYmFjay4KICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICAgICA6IERTSSBFcnJvciBDYWxsYmFjawogICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgIDogRFNJIE1zcEluaXQuCiAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgOiBEU0kgTXNwRGVJbml0LgoKICAgIFsuLl0KICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBIQUxfRFNJX0luaXQgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9EU0lfU1RBVEVfUkVTRVQKICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKICAgIGV4YW1wbGVzIEhBTF9EU0lfVGVhcmluZ0VmZmVjdENhbGxiYWNrKCksIEhBTF9EU0lfRW5kT2ZSZWZyZXNoQ2FsbGJhY2soKS4KICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlc3BlY3RpdmVseQogICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEhBTF9EU0lfSW5pdCgpCiAgICBhbmQgSEFMX0RTSV9EZUluaXQoKSBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgSEFMX0RTSV9Jbml0KCkgYW5kIEhBTF9EU0lfRGVJbml0KCkKICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCgogICAgWy4uXQogICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfRFNJX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCiAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAogICAgaW4gSEFMX0RTSV9TVEFURV9SRUFEWSBvciBIQUxfRFNJX1NUQVRFX1JFU0VUIHN0YXRlLAogICAgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KICAgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKICAgIHVzaW5nIEhBTF9EU0lfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEhBTF9EU0lfRGVJbml0KCkKICAgIG9yIEhBTF9EU0lfSW5pdCgpIGZ1bmN0aW9uLgoKICAgIFsuLl0KICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0RTSV9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcwogICAgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucy4KCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJzdG0zMmw0eHhfaGFsLmgiCgovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCiNpZmRlZiBIQUxfRFNJX01PRFVMRV9FTkFCTEVECgojaWYgZGVmaW5lZChEU0kpCgovKiogQGFkZHRvZ3JvdXAgRFNJCiAgKiBAewogICovCgovKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgRFNJX1ByaXZhdGVfQ29uc3RhbnRzCiAgKiBAewogICovCiNkZWZpbmUgRFNJX1RJTUVPVVRfVkFMVUUgKCh1aW50MzJfdCkxMDBVKSAgLyogMTAwbXMgKi8KCiNkZWZpbmUgRFNJX0VSUk9SX0FDS19NQVNLIChEU0lfSVNSMF9BRTAgfCBEU0lfSVNSMF9BRTEgfCBEU0lfSVNSMF9BRTIgfCBEU0lfSVNSMF9BRTMgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0lfSVNSMF9BRTQgfCBEU0lfSVNSMF9BRTUgfCBEU0lfSVNSMF9BRTYgfCBEU0lfSVNSMF9BRTcgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0lfSVNSMF9BRTggfCBEU0lfSVNSMF9BRTkgfCBEU0lfSVNSMF9BRTEwIHwgRFNJX0lTUjBfQUUxMSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSV9JU1IwX0FFMTIgfCBEU0lfSVNSMF9BRTEzIHwgRFNJX0lTUjBfQUUxNCB8IERTSV9JU1IwX0FFMTUpCiNkZWZpbmUgRFNJX0VSUk9SX1BIWV9NQVNLIChEU0lfSVNSMF9QRTAgfCBEU0lfSVNSMF9QRTEgfCBEU0lfSVNSMF9QRTIgfCBEU0lfSVNSMF9QRTMgfCBEU0lfSVNSMF9QRTQpCiNkZWZpbmUgRFNJX0VSUk9SX1RYX01BU0sgIERTSV9JU1IxX1RPSFNUWAojZGVmaW5lIERTSV9FUlJPUl9SWF9NQVNLICBEU0lfSVNSMV9UT0xQUlgKI2RlZmluZSBEU0lfRVJST1JfRUNDX01BU0sgKERTSV9JU1IxX0VDQ1NFIHwgRFNJX0lTUjFfRUNDTUUpCiNkZWZpbmUgRFNJX0VSUk9SX0NSQ19NQVNLIERTSV9JU1IxX0NSQ0UKI2RlZmluZSBEU0lfRVJST1JfUFNFX01BU0sgRFNJX0lTUjFfUFNFCiNkZWZpbmUgRFNJX0VSUk9SX0VPVF9NQVNLIERTSV9JU1IxX0VPVFBFCiNkZWZpbmUgRFNJX0VSUk9SX09WRl9NQVNLIERTSV9JU1IxX0xQV1JFCiNkZWZpbmUgRFNJX0VSUk9SX0dFTl9NQVNLIChEU0lfSVNSMV9HQ1dSRSB8IERTSV9JU1IxX0dQV1JFIHwgRFNJX0lTUjFfR1BUWEUgfCBEU0lfSVNSMV9HUFJERSB8IERTSV9JU1IxX0dQUlhFKQovKioKICAqIEB9CiAgKi8KCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIERTSV9Db25maWdQYWNrZXRIZWFkZXIoRFNJX1R5cGVEZWYgKkRTSXgsIHVpbnQzMl90IENoYW5uZWxJRCwgdWludDMyX3QgRGF0YVR5cGUsIHVpbnQzMl90IERhdGEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERhdGExKTsKCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBEU0lfU2hvcnRXcml0ZShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJhbTIpOwovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGRlZmdyb3VwIERTSV9Qcml2YXRlX0Z1bmN0aW9ucyBEU0kgUHJpdmF0ZSBGdW5jdGlvbnMKICAqIEB7CiAgKi8KLyoqCiAgKiBAYnJpZWYgIEdlbmVyaWMgRFNJIHBhY2tldCBoZWFkZXIgY29uZmlndXJhdGlvbgogICogQHBhcmFtICBEU0l4ICBQb2ludGVyIHRvIERTSSByZWdpc3RlciBiYXNlCiAgKiBAcGFyYW0gIENoYW5uZWxJRCBWaXJ0dWFsIGNoYW5uZWwgSUQgb2YgdGhlIGhlYWRlciBwYWNrZXQKICAqIEBwYXJhbSAgRGF0YVR5cGUgIFBhY2tldCBkYXRhIHR5cGUgb2YgdGhlIGhlYWRlciBwYWNrZXQKICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgOgogICogICAgICAgICAgICAgICAgICAgICAgQGFyZyBEU0lfU0hPUlRfV1JJVEVfUEtUX0RhdGFfVHlwZQogICogICAgICAgICAgICAgICAgICAgICAgQGFyZyBEU0lfTE9OR19XUklURV9QS1RfRGF0YV9UeXBlCiAgKiAgICAgICAgICAgICAgICAgICAgICBAYXJnIERTSV9TSE9SVF9SRUFEX1BLVF9EYXRhX1R5cGUKICAqICAgICAgICAgICAgICAgICAgICAgIEBhcmcgRFNJX01BWF9SRVRVUk5fUEtUX1NJWkUKICAqIEBwYXJhbSAgRGF0YTAgIFdvcmQgY291bnQgTFNCCiAgKiBAcGFyYW0gIERhdGExICBXb3JkIGNvdW50IE1TQgogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgRFNJX0NvbmZpZ1BhY2tldEhlYWRlcihEU0lfVHlwZURlZiAqRFNJeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YTEpCnsKICAvKiBVcGRhdGUgdGhlIERTSSBwYWNrZXQgaGVhZGVyIHdpdGggbmV3IGluZm9ybWF0aW9uICovCiAgRFNJeC0+R0hDUiA9IChEYXRhVHlwZSB8IChDaGFubmVsSUQgPDwgNlUpIHwgKERhdGEwIDw8IDhVKSB8IChEYXRhMSA8PCAxNlUpKTsKfQoKLyoqCiAgKiBAYnJpZWYgIHdyaXRlIHNob3J0IERDUyBvciBzaG9ydCBHZW5lcmljIGNvbW1hbmQKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBDaGFubmVsSUQgIFZpcnR1YWwgY2hhbm5lbCBJRC4KICAqIEBwYXJhbSAgTW9kZSAgRFNJIHNob3J0IHBhY2tldCBkYXRhIHR5cGUuCiAgKiAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQGFyZyBEU0lfU0hPUlRfV1JJVEVfUEtUX0RhdGFfVHlwZS4KICAqIEBwYXJhbSAgUGFyYW0xICBEU0MgY29tbWFuZCBvciBmaXJzdCBnZW5lcmljIHBhcmFtZXRlci4KICAqICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEBhcmcgRFNJX0RDU19Db21tYW5kIG9yIGEKICAqICAgICAgICAgICAgICAgICBnZW5lcmljIGNvbW1hbmQgY29kZS4KICAqIEBwYXJhbSAgUGFyYW0yICBEU0MgcGFyYW1ldGVyIG9yIHNlY29uZCBnZW5lcmljIHBhcmFtZXRlci4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBEU0lfU2hvcnRXcml0ZShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJhbTIpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CgogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKCiAgLyogV2FpdCBmb3IgQ29tbWFuZCBGSUZPIEVtcHR5ICovCiAgd2hpbGUgKChoZHNpLT5JbnN0YW5jZS0+R1BTUiAmIERTSV9HUFNSX0NNREZFKSA9PSAwVSkKICB7CiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBEU0lfVElNRU9VVF9WQUxVRSkKICAgIHsKICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgfQogIH0KCiAgLyogQ29uZmlndXJlIHRoZSBwYWNrZXQgdG8gc2VuZCBhIHNob3J0IERDUyBjb21tYW5kIHdpdGggMCBvciAxIHBhcmFtZXRlciAqLwogIC8qIFVwZGF0ZSB0aGUgRFNJIHBhY2tldCBoZWFkZXIgd2l0aCBuZXcgaW5mb3JtYXRpb24gKi8KICBoZHNpLT5JbnN0YW5jZS0+R0hDUiA9IChNb2RlIHwgKENoYW5uZWxJRCA8PCA2VSkgfCAoUGFyYW0xIDw8IDhVKSB8IChQYXJhbTIgPDwgMTZVKSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQH0KICAqLwoKLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqIEBhZGR0b2dyb3VwIERTSV9FeHBvcnRlZF9GdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgRFNJX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKICAqCkB2ZXJiYXRpbQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBEU0kKICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIERTSQoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIERTSSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBEU0lfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgUExMSW5pdCAgcG9pbnRlciB0byBhIERTSV9QTExJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgICB0aGUgUExMIENsb2NrIHN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9Jbml0KERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCBEU0lfUExMSW5pdFR5cGVEZWYgKlBMTEluaXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgdWludDMyX3QgdW5pdEludGVydmFseDQ7CiAgdWludDMyX3QgdGVtcElERjsKCiAgLyogQ2hlY2sgdGhlIERTSSBoYW5kbGUgYWxsb2NhdGlvbiAqLwogIGlmIChoZHNpID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfRFNJX1BMTF9ORElWKFBMTEluaXQtPlBMTE5ESVYpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX1BMTF9JREYoUExMSW5pdC0+UExMSURGKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9QTExfT0RGKFBMTEluaXQtPlBMTE9ERikpOwogIGFzc2VydF9wYXJhbShJU19EU0lfQVVUT19DTEtMQU5FX0NPTlRST0woaGRzaS0+SW5pdC5BdXRvbWF0aWNDbG9ja0xhbmVDb250cm9sKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9OVU1CRVJfT0ZfTEFORVMoaGRzaS0+SW5pdC5OdW1iZXJPZkxhbmVzKSk7CgojaWYgKFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIGlmIChoZHNpLT5TdGF0ZSA9PSBIQUxfRFNJX1NUQVRFX1JFU0VUKQogIHsKICAgIC8qIFJlc2V0IHRoZSBEU0kgY2FsbGJhY2sgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLwogICAgaGRzaS0+VGVhcmluZ0VmZmVjdENhbGxiYWNrID0gSEFMX0RTSV9UZWFyaW5nRWZmZWN0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFRlYXJpbmdFZmZlY3RDYWxsYmFjayAqLwogICAgaGRzaS0+RW5kT2ZSZWZyZXNoQ2FsbGJhY2sgID0gSEFMX0RTSV9FbmRPZlJlZnJlc2hDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEVuZE9mUmVmcmVzaENhbGxiYWNrICAqLwogICAgaGRzaS0+RXJyb3JDYWxsYmFjayAgICAgICAgID0gSEFMX0RTSV9FcnJvckNhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICAqLwoKICAgIGlmIChoZHNpLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgIHsKICAgICAgaGRzaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RTSV9Nc3BJbml0OwogICAgfQogICAgLyogSW5pdGlhbGl6ZSB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgICBoZHNpLT5Nc3BJbml0Q2FsbGJhY2soaGRzaSk7CiAgfQojZWxzZQogIGlmIChoZHNpLT5TdGF0ZSA9PSBIQUxfRFNJX1NUQVRFX1JFU0VUKQogIHsKICAgIC8qIEluaXRpYWxpemUgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogICAgSEFMX0RTSV9Nc3BJbml0KGhkc2kpOwogIH0KI2VuZGlmIC8qIFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyAqLwoKICAvKiBDaGFuZ2UgRFNJIHBlcmlwaGVyYWwgc3RhdGUgKi8KICBoZHNpLT5TdGF0ZSA9IEhBTF9EU0lfU1RBVEVfQlVTWTsKCiAgLyoqKioqKioqKioqKioqKiogVHVybiBvbiB0aGUgcmVndWxhdG9yIGFuZCBlbmFibGUgdGhlIERTSSBQTEwgKioqKioqKioqKioqKioqKi8KCiAgLyogRW5hYmxlIHRoZSByZWd1bGF0b3IgKi8KICBfX0hBTF9EU0lfUkVHX0VOQUJMRShoZHNpKTsKCiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAvKiBXYWl0IHVudGlsIHRoZSByZWd1bGF0b3IgaXMgcmVhZHkgKi8KICB3aGlsZSAoX19IQUxfRFNJX0dFVF9GTEFHKGhkc2ksIERTSV9GTEFHX1JSUykgPT0gMFUpCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gRFNJX1RJTUVPVVRfVkFMVUUpCiAgICB7CiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgIH0KICB9CgogIC8qIFNldCB0aGUgUExMIGRpdmlzaW9uIGZhY3RvcnMgKi8KICBoZHNpLT5JbnN0YW5jZS0+V1JQQ1IgJj0gfihEU0lfV1JQQ1JfUExMX05ESVYgfCBEU0lfV1JQQ1JfUExMX0lERiB8IERTSV9XUlBDUl9QTExfT0RGKTsKICBoZHNpLT5JbnN0YW5jZS0+V1JQQ1IgfD0gKCgoUExMSW5pdC0+UExMTkRJVikgPDwgRFNJX1dSUENSX1BMTF9ORElWX1BvcykgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBMTEluaXQtPlBMTElERikgPDwgRFNJX1dSUENSX1BMTF9JREZfUG9zKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUExMSW5pdC0+UExMT0RGKSA8PCBEU0lfV1JQQ1JfUExMX09ERl9Qb3MpKTsKCiAgLyogRW5hYmxlIHRoZSBEU0kgUExMICovCiAgX19IQUxfRFNJX1BMTF9FTkFCTEUoaGRzaSk7CgogIC8qIFJlcXVpcmVzIG1pbiBvZiA0MDC1cyBkZWxheSBiZWZvcmUgcmVhZGluZyB0aGUgUExMTFMgZmxhZyAqLwogIC8qIDFtcyBkZWxheSBpcyBpbnNlcnRlZCB0aGF0IGlzIHRoZSBtaW5pbXVtIEhBTCBkZWxheSBncmFudWxhcml0eSAqLwogIEhBTF9EZWxheSgxKTsKCiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAvKiBXYWl0IGZvciB0aGUgbG9jayBvZiB0aGUgUExMICovCiAgd2hpbGUgKF9fSEFMX0RTSV9HRVRfRkxBRyhoZHNpLCBEU0lfRkxBR19QTExMUykgPT0gMFUpCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gRFNJX1RJTUVPVVRfVkFMVUUpCiAgICB7CiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgIH0KICB9CgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogU2V0IHRoZSBQSFkgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qIEQtUEhZIGNsb2NrIGFuZCBkaWdpdGFsIGVuYWJsZSovCiAgaGRzaS0+SW5zdGFuY2UtPlBDVExSIHw9IChEU0lfUENUTFJfQ0tFIHwgRFNJX1BDVExSX0RFTik7CgogIC8qIENsb2NrIGxhbmUgY29uZmlndXJhdGlvbiAqLwogIGhkc2ktPkluc3RhbmNlLT5DTENSICY9IH4oRFNJX0NMQ1JfRFBDQyB8IERTSV9DTENSX0FDUik7CiAgaGRzaS0+SW5zdGFuY2UtPkNMQ1IgfD0gKERTSV9DTENSX0RQQ0MgfCBoZHNpLT5Jbml0LkF1dG9tYXRpY0Nsb2NrTGFuZUNvbnRyb2wpOwoKICAvKiBDb25maWd1cmUgdGhlIG51bWJlciBvZiBhY3RpdmUgZGF0YSBsYW5lcyAqLwogIGhkc2ktPkluc3RhbmNlLT5QQ09ORlIgJj0gfkRTSV9QQ09ORlJfTkw7CiAgaGRzaS0+SW5zdGFuY2UtPlBDT05GUiB8PSBoZHNpLT5Jbml0Lk51bWJlck9mTGFuZXM7CgogIC8qKioqKioqKioqKioqKioqKioqKioqKiogU2V0IHRoZSBEU0kgY2xvY2sgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qIFNldCB0aGUgVFggZXNjYXBlIGNsb2NrIGRpdmlzaW9uIGZhY3RvciAqLwogIGhkc2ktPkluc3RhbmNlLT5DQ1IgJj0gfkRTSV9DQ1JfVFhFQ0tESVY7CiAgaGRzaS0+SW5zdGFuY2UtPkNDUiB8PSBoZHNpLT5Jbml0LlRYRXNjYXBlQ2tkaXY7CgogIC8qIENhbGN1bGF0ZSB0aGUgYml0IHBlcmlvZCBpbiBoaWdoLXNwZWVkIG1vZGUgaW4gdW5pdCBvZiAwLjI1IG5zIChVSVg0KSAqLwogIC8qIFRoZSBlcXVhdGlvbiBpcyA6IFVJWDQgPSBJbnRlZ2VyUGFydCggKDEwMDAvRl9QSFlfTWh6KSAqIDQgKSAgICAgICAgICAqLwogIC8qIFdoZXJlIDogRl9QSFlfTWh6ID0gKE5ESVYgKiBIU0VfTWh6KSAvIChJREYgKiBPREYpICAgICAgICAgICAgICAgICAgICAqLwogIHRlbXBJREYgPSAoUExMSW5pdC0+UExMSURGID4gMFUpID8gUExMSW5pdC0+UExMSURGIDogMVU7CiAgdW5pdEludGVydmFseDQgPSAoNDAwMDAwMFUgKiB0ZW1wSURGICogKCgxVUwgPDwgKDB4M1UgJiBQTExJbml0LT5QTExPREYpKSkpIC8gKChIU0VfVkFMVUUgLyAxMDAwVSkgKiBQTExJbml0LT5QTExORElWKTsKCiAgLyogU2V0IHRoZSBiaXQgcGVyaW9kIGluIGhpZ2gtc3BlZWQgbW9kZSAqLwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1VJWDQ7CiAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9IHVuaXRJbnRlcnZhbHg0OwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVycm9yIG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qIERpc2FibGUgYWxsIGVycm9yIGludGVycnVwdHMgYW5kIHJlc2V0IHRoZSBFcnJvciBNYXNrICovCiAgaGRzaS0+SW5zdGFuY2UtPklFUlswVV0gPSAwVTsKICBoZHNpLT5JbnN0YW5jZS0+SUVSWzFVXSA9IDBVOwogIGhkc2ktPkVycm9yTXNrID0gMFU7CgogIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KICBoZHNpLT5FcnJvckNvZGUgPSBIQUxfRFNJX0VSUk9SX05PTkU7CgogIC8qIEluaXRpYWxpemUgdGhlIERTSSBzdGF0ZSovCiAgaGRzaS0+U3RhdGUgPSBIQUxfRFNJX1NUQVRFX1JFQURZOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgRGUtaW5pdGlhbGl6ZXMgdGhlIERTSSBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0CiAgKiAgICAgICAgIHZhbHVlcy4KICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9EZUluaXQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICAvKiBDaGVjayB0aGUgRFNJIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGhkc2kgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogQ2hhbmdlIERTSSBwZXJpcGhlcmFsIHN0YXRlICovCiAgaGRzaS0+U3RhdGUgPSBIQUxfRFNJX1NUQVRFX0JVU1k7CgogIC8qIERpc2FibGUgdGhlIERTSSB3cmFwcGVyICovCiAgX19IQUxfRFNJX1dSQVBQRVJfRElTQUJMRShoZHNpKTsKCiAgLyogRGlzYWJsZSB0aGUgRFNJIGhvc3QgKi8KICBfX0hBTF9EU0lfRElTQUJMRShoZHNpKTsKCiAgLyogRC1QSFkgY2xvY2sgYW5kIGRpZ2l0YWwgZGlzYWJsZSAqLwogIGhkc2ktPkluc3RhbmNlLT5QQ1RMUiAmPSB+KERTSV9QQ1RMUl9DS0UgfCBEU0lfUENUTFJfREVOKTsKCiAgLyogVHVybiBvZmYgdGhlIERTSSBQTEwgKi8KICBfX0hBTF9EU0lfUExMX0RJU0FCTEUoaGRzaSk7CgogIC8qIERpc2FibGUgdGhlIHJlZ3VsYXRvciAqLwogIF9fSEFMX0RTSV9SRUdfRElTQUJMRShoZHNpKTsKCiNpZiAoVVNFX0hBTF9EU0lfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgaWYgKGhkc2ktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgewogICAgaGRzaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRFNJX01zcERlSW5pdDsKICB9CiAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICBoZHNpLT5Nc3BEZUluaXRDYWxsYmFjayhoZHNpKTsKI2Vsc2UKICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogIEhBTF9EU0lfTXNwRGVJbml0KGhkc2kpOwojZW5kaWYgLyogVVNFX0hBTF9EU0lfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgogIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KICBoZHNpLT5FcnJvckNvZGUgPSBIQUxfRFNJX0VSUk9SX05PTkU7CgogIC8qIEluaXRpYWxpemUgdGhlIERTSSBzdGF0ZSovCiAgaGRzaS0+U3RhdGUgPSBIQUxfRFNJX1NUQVRFX1JFU0VUOwoKICAvKiBSZWxlYXNlIExvY2sgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBFbmFibGUgdGhlIGVycm9yIG1vbml0b3IgZmxhZ3MKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBBY3RpdmVFcnJvcnMgIGluZGljYXRlcyB3aGljaCBlcnJvciBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZC4KICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgQGFyZyBEU0lfRXJyb3JfRGF0YV9UeXBlLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9Db25maWdFcnJvck1vbml0b3IoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IEFjdGl2ZUVycm9ycykKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgaGRzaS0+SW5zdGFuY2UtPklFUlswVV0gPSAwVTsKICBoZHNpLT5JbnN0YW5jZS0+SUVSWzFVXSA9IDBVOwoKICAvKiBTdG9yZSBhY3RpdmUgZXJyb3JzIHRvIHRoZSBoYW5kbGUgKi8KICBoZHNpLT5FcnJvck1zayA9IEFjdGl2ZUVycm9yczsKCiAgaWYgKChBY3RpdmVFcnJvcnMgJiBIQUxfRFNJX0VSUk9SX0FDSykgIT0gMFUpCiAgewogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiBzZWxlY3RlZCBlcnJvcnMgKi8KICAgIGhkc2ktPkluc3RhbmNlLT5JRVJbMFVdIHw9IERTSV9FUlJPUl9BQ0tfTUFTSzsKICB9CgogIGlmICgoQWN0aXZlRXJyb3JzICYgSEFMX0RTSV9FUlJPUl9QSFkpICE9IDBVKQogIHsKICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc2VsZWN0ZWQgZXJyb3JzICovCiAgICBoZHNpLT5JbnN0YW5jZS0+SUVSWzBVXSB8PSBEU0lfRVJST1JfUEhZX01BU0s7CiAgfQoKICBpZiAoKEFjdGl2ZUVycm9ycyAmIEhBTF9EU0lfRVJST1JfVFgpICE9IDBVKQogIHsKICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc2VsZWN0ZWQgZXJyb3JzICovCiAgICBoZHNpLT5JbnN0YW5jZS0+SUVSWzFVXSB8PSBEU0lfRVJST1JfVFhfTUFTSzsKICB9CgogIGlmICgoQWN0aXZlRXJyb3JzICYgSEFMX0RTSV9FUlJPUl9SWCkgIT0gMFUpCiAgewogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiBzZWxlY3RlZCBlcnJvcnMgKi8KICAgIGhkc2ktPkluc3RhbmNlLT5JRVJbMVVdIHw9IERTSV9FUlJPUl9SWF9NQVNLOwogIH0KCiAgaWYgKChBY3RpdmVFcnJvcnMgJiBIQUxfRFNJX0VSUk9SX0VDQykgIT0gMFUpCiAgewogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiBzZWxlY3RlZCBlcnJvcnMgKi8KICAgIGhkc2ktPkluc3RhbmNlLT5JRVJbMVVdIHw9IERTSV9FUlJPUl9FQ0NfTUFTSzsKICB9CgogIGlmICgoQWN0aXZlRXJyb3JzICYgSEFMX0RTSV9FUlJPUl9DUkMpICE9IDBVKQogIHsKICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc2VsZWN0ZWQgZXJyb3JzICovCiAgICBoZHNpLT5JbnN0YW5jZS0+SUVSWzFVXSB8PSBEU0lfRVJST1JfQ1JDX01BU0s7CiAgfQoKICBpZiAoKEFjdGl2ZUVycm9ycyAmIEhBTF9EU0lfRVJST1JfUFNFKSAhPSAwVSkKICB7CiAgICAvKiBFbmFibGUgdGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHNlbGVjdGVkIGVycm9ycyAqLwogICAgaGRzaS0+SW5zdGFuY2UtPklFUlsxVV0gfD0gRFNJX0VSUk9SX1BTRV9NQVNLOwogIH0KCiAgaWYgKChBY3RpdmVFcnJvcnMgJiBIQUxfRFNJX0VSUk9SX0VPVCkgIT0gMFUpCiAgewogICAgLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiBzZWxlY3RlZCBlcnJvcnMgKi8KICAgIGhkc2ktPkluc3RhbmNlLT5JRVJbMVVdIHw9IERTSV9FUlJPUl9FT1RfTUFTSzsKICB9CgogIGlmICgoQWN0aXZlRXJyb3JzICYgSEFMX0RTSV9FUlJPUl9PVkYpICE9IDBVKQogIHsKICAgIC8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc2VsZWN0ZWQgZXJyb3JzICovCiAgICBoZHNpLT5JbnN0YW5jZS0+SUVSWzFVXSB8PSBEU0lfRVJST1JfT1ZGX01BU0s7CiAgfQoKICBpZiAoKEFjdGl2ZUVycm9ycyAmIEhBTF9EU0lfRVJST1JfR0VOKSAhPSAwVSkKICB7CiAgICAvKiBFbmFibGUgdGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHNlbGVjdGVkIGVycm9ycyAqLwogICAgaGRzaS0+SW5zdGFuY2UtPklFUlsxVV0gfD0gRFNJX0VSUk9SX0dFTl9NQVNLOwogIH0KCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBEU0kgTVNQLgogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfRFNJX01zcEluaXQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhkc2kpOwogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9EU0lfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQGJyaWVmICBEZS1pbml0aWFsaXplcyB0aGUgRFNJIE1TUC4KICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0RTSV9Nc3BEZUluaXQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhkc2kpOwogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9EU0lfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKI2lmIChVU0VfSEFMX0RTSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLyoqCiAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBEU0kgQ2FsbGJhY2sKICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2sKICAqIEBwYXJhbSBoZHNpIGRzaSBoYW5kbGUKICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCiAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgIEBhcmcgSEFMX0RTSV9URUFSSU5HX0VGRkVDVF9DQl9JRCBUZWFyaW5nIEVmZmVjdCBDYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX0VORE9GX1JFRlJFU0hfQ0JfSUQgRW5kIE9mIFJlZnJlc2ggQ2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgSEFMX0RTSV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9SZWdpc3RlckNhbGxiYWNrKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCBIQUxfRFNJX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRFNJX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgIGhkc2ktPkVycm9yQ29kZSB8PSBIQUxfRFNJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CgogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICBpZiAoaGRzaS0+U3RhdGUgPT0gSEFMX0RTSV9TVEFURV9SRUFEWSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX0RTSV9URUFSSU5HX0VGRkVDVF9DQl9JRCA6CiAgICAgICAgaGRzaS0+VGVhcmluZ0VmZmVjdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfRFNJX0VORE9GX1JFRlJFU0hfQ0JfSUQgOgogICAgICAgIGhkc2ktPkVuZE9mUmVmcmVzaENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfRFNJX0VSUk9SX0NCX0lEIDoKICAgICAgICBoZHNpLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfRFNJX01TUElOSVRfQ0JfSUQgOgogICAgICAgIGhkc2ktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX0RTSV9NU1BERUlOSVRfQ0JfSUQgOgogICAgICAgIGhkc2ktPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgZWxzZSBpZiAoaGRzaS0+U3RhdGUgPT0gSEFMX0RTSV9TVEFURV9SRVNFVCkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX0RTSV9NU1BJTklUX0NCX0lEIDoKICAgICAgICBoZHNpLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9EU0lfTVNQREVJTklUX0NCX0lEIDoKICAgICAgICBoZHNpLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQgOgogICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICAgIGhkc2ktPkVycm9yQ29kZSB8PSBIQUxfRFNJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgIGhkc2ktPkVycm9yQ29kZSB8PSBIQUxfRFNJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0KCiAgLyogUmVsZWFzZSBMb2NrICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgVW5yZWdpc3RlciBhIERTSSBDYWxsYmFjawogICogICAgICAgICBEU0kgY2FsbGFiY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gaGRzaSBkc2kgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgIEBhcmcgSEFMX0RTSV9URUFSSU5HX0VGRkVDVF9DQl9JRCBUZWFyaW5nIEVmZmVjdCBDYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX0VORE9GX1JFRlJFU0hfQ0JfSUQgRW5kIE9mIFJlZnJlc2ggQ2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgSEFMX0RTSV9FUlJPUl9DQl9JRCBFcnJvciBDYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBIQUxfRFNJX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9VblJlZ2lzdGVyQ2FsbGJhY2soRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIEhBTF9EU0lfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICBpZiAoaGRzaS0+U3RhdGUgPT0gSEFMX0RTSV9TVEFURV9SRUFEWSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX0RTSV9URUFSSU5HX0VGRkVDVF9DQl9JRCA6CiAgICAgICAgaGRzaS0+VGVhcmluZ0VmZmVjdENhbGxiYWNrID0gSEFMX0RTSV9UZWFyaW5nRWZmZWN0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIFRlYXJpbmdFZmZlY3RDYWxsYmFjayAqLwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfRFNJX0VORE9GX1JFRlJFU0hfQ0JfSUQgOgogICAgICAgIGhkc2ktPkVuZE9mUmVmcmVzaENhbGxiYWNrID0gSEFMX0RTSV9FbmRPZlJlZnJlc2hDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBFbmRPZlJlZnJlc2hDYWxsYmFjayAgKi8KICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX0RTSV9FUlJPUl9DQl9JRCA6CiAgICAgICAgaGRzaS0+RXJyb3JDYWxsYmFjayAgICAgICAgPSBIQUxfRFNJX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgICovCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9EU0lfTVNQSU5JVF9DQl9JRCA6CiAgICAgICAgaGRzaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RTSV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgICAgICovCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEhBTF9EU0lfTVNQREVJTklUX0NCX0lEIDoKICAgICAgICBoZHNpLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9EU0lfTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0IENhbGxiYWNrICAgKi8KICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQgOgogICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICAgIGhkc2ktPkVycm9yQ29kZSB8PSBIQUxfRFNJX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UgaWYgKGhkc2ktPlN0YXRlID09IEhBTF9EU0lfU1RBVEVfUkVTRVQpCiAgewogICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgewogICAgICBjYXNlIEhBTF9EU0lfTVNQSU5JVF9DQl9JRCA6CiAgICAgICAgaGRzaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RTSV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgICAqLwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfRFNJX01TUERFSU5JVF9DQl9JRCA6CiAgICAgICAgaGRzaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRFNJX01zcERlSW5pdDsgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCBDYWxsYmFjayAqLwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfQoKICAvKiBSZWxlYXNlIExvY2sgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmIC8qIFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyAqLwoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIERTSV9Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCiAgKgpAdmVyYmF0aW0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICAjIyMjIwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9uIGFsbG93aW5nIHRvOgogICAgICAoKykgSGFuZGxlIERTSSBpbnRlcnJ1cHQgcmVxdWVzdAoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCi8qKgogICogQGJyaWVmICBIYW5kbGVzIERTSSBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kdm9pZCBIQUxfRFNJX0lSUUhhbmRsZXIoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICB1aW50MzJfdCBFcnJvclN0YXR1czA7CiAgdWludDMyX3QgRXJyb3JTdGF0dXMxOwoKICAvKiBUZWFyaW5nIEVmZmVjdCBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgaWYgKF9fSEFMX0RTSV9HRVRfRkxBRyhoZHNpLCBEU0lfRkxBR19URSkgIT0gMFUpCiAgewogICAgaWYgKF9fSEFMX0RTSV9HRVRfSVRfU09VUkNFKGhkc2ksIERTSV9JVF9URSkgIT0gMFUpCiAgICB7CiAgICAgIC8qIENsZWFyIHRoZSBUZWFyaW5nIEVmZmVjdCBJbnRlcnJ1cHQgRmxhZyAqLwogICAgICBfX0hBTF9EU0lfQ0xFQVJfRkxBRyhoZHNpLCBEU0lfRkxBR19URSk7CgogICAgICAvKiBUZWFyaW5nIEVmZmVjdCBDYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBUZWFyaW5nIEVmZmVjdCBjYWxsYmFjayAqLwogICAgICBoZHNpLT5UZWFyaW5nRWZmZWN0Q2FsbGJhY2soaGRzaSk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgVGVhcmluZyBFZmZlY3QgY2FsbGJhY2sqLwogICAgICBIQUxfRFNJX1RlYXJpbmdFZmZlY3RDYWxsYmFjayhoZHNpKTsKI2VuZGlmIC8qIFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQogIH0KCiAgLyogRW5kIG9mIFJlZnJlc2ggSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIGlmIChfX0hBTF9EU0lfR0VUX0ZMQUcoaGRzaSwgRFNJX0ZMQUdfRVIpICE9IDBVKQogIHsKICAgIGlmIChfX0hBTF9EU0lfR0VUX0lUX1NPVVJDRShoZHNpLCBEU0lfSVRfRVIpICE9IDBVKQogICAgewogICAgICAvKiBDbGVhciB0aGUgRW5kIG9mIFJlZnJlc2ggSW50ZXJydXB0IEZsYWcgKi8KICAgICAgX19IQUxfRFNJX0NMRUFSX0ZMQUcoaGRzaSwgRFNJX0ZMQUdfRVIpOwoKICAgICAgLyogRW5kIG9mIFJlZnJlc2ggQ2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0RTSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgRW5kIG9mIHJlZnJlc2ggY2FsbGJhY2sgKi8KICAgICAgaGRzaS0+RW5kT2ZSZWZyZXNoQ2FsbGJhY2soaGRzaSk7CiNlbHNlCiAgICAgIC8qQ2FsbCBMZWdhY3kgRW5kIG9mIHJlZnJlc2ggY2FsbGJhY2sgKi8KICAgICAgSEFMX0RTSV9FbmRPZlJlZnJlc2hDYWxsYmFjayhoZHNpKTsKI2VuZGlmIC8qIFVTRV9IQUxfRFNJX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQogIH0KCiAgLyogRXJyb3IgSW50ZXJydXB0cyBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIGlmIChoZHNpLT5FcnJvck1zayAhPSAwVSkKICB7CiAgICBFcnJvclN0YXR1czAgPSBoZHNpLT5JbnN0YW5jZS0+SVNSWzBVXTsKICAgIEVycm9yU3RhdHVzMCAmPSBoZHNpLT5JbnN0YW5jZS0+SUVSWzBVXTsKICAgIEVycm9yU3RhdHVzMSA9IGhkc2ktPkluc3RhbmNlLT5JU1JbMVVdOwogICAgRXJyb3JTdGF0dXMxICY9IGhkc2ktPkluc3RhbmNlLT5JRVJbMVVdOwoKICAgIGlmICgoRXJyb3JTdGF0dXMwICYgRFNJX0VSUk9SX0FDS19NQVNLKSAhPSAwVSkKICAgIHsKICAgICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfQUNLOwogICAgfQoKICAgIGlmICgoRXJyb3JTdGF0dXMwICYgRFNJX0VSUk9SX1BIWV9NQVNLKSAhPSAwVSkKICAgIHsKICAgICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfUEhZOwogICAgfQoKICAgIGlmICgoRXJyb3JTdGF0dXMxICYgRFNJX0VSUk9SX1RYX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9UWDsKICAgIH0KCiAgICBpZiAoKEVycm9yU3RhdHVzMSAmIERTSV9FUlJPUl9SWF9NQVNLKSAhPSAwVSkKICAgIHsKICAgICAgaGRzaS0+RXJyb3JDb2RlIHw9IEhBTF9EU0lfRVJST1JfUlg7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfRUNDX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9FQ0M7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfQ1JDX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9DUkM7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfUFNFX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9QU0U7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfRU9UX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9FT1Q7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfT1ZGX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9PVkY7CiAgICB9CgogICAgaWYgKChFcnJvclN0YXR1czEgJiBEU0lfRVJST1JfR0VOX01BU0spICE9IDBVKQogICAgewogICAgICBoZHNpLT5FcnJvckNvZGUgfD0gSEFMX0RTSV9FUlJPUl9HRU47CiAgICB9CgogICAgLyogQ2hlY2sgb25seSBzZWxlY3RlZCBlcnJvcnMgKi8KICAgIGlmIChoZHNpLT5FcnJvckNvZGUgIT0gSEFMX0RTSV9FUlJPUl9OT05FKQogICAgewogICAgICAvKiBEU0kgZXJyb3IgaW50ZXJydXB0IGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9EU0lfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIEVycm9yIGNhbGxiYWNrICovCiAgICAgIGhkc2ktPkVycm9yQ2FsbGJhY2soaGRzaSk7CiNlbHNlCiAgICAgIC8qQ2FsbCBMZWdhY3kgRXJyb3IgY2FsbGJhY2sgKi8KICAgICAgSEFMX0RTSV9FcnJvckNhbGxiYWNrKGhkc2kpOwojZW5kaWYgLyogVVNFX0hBTF9EU0lfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICB9CiAgfQp9CgovKioKICAqIEBicmllZiAgVGVhcmluZyBFZmZlY3QgRFNJIGNhbGxiYWNrLgogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfRFNJX1RlYXJpbmdFZmZlY3RDYWxsYmFjayhEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGRzaSk7CiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0RTSV9UZWFyaW5nRWZmZWN0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgRW5kIG9mIFJlZnJlc2ggRFNJIGNhbGxiYWNrLgogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfRFNJX0VuZE9mUmVmcmVzaENhbGxiYWNrKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoZHNpKTsKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfRFNJX0VuZE9mUmVmcmVzaENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAYnJpZWYgIE9wZXJhdGlvbiBFcnJvciBEU0kgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9EU0lfRXJyb3JDYWxsYmFjayhEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGRzaSk7CiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0RTSV9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIERTSV9Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwogICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCiAgKgpAdmVyYmF0aW0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgQ29uZmlndXJlIHRoZSBHZW5lcmljIGludGVyZmFjZSByZWFkLWJhY2sgVmlydHVhbCBDaGFubmVsIElECiAgICAgICgrKSBTZWxlY3QgdmlkZW8gbW9kZSBhbmQgY29uZmlndXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMKICAgICAgKCspIENvbmZpZ3VyZSBjb21tYW5kIHRyYW5zbWlzc2lvbiBtb2RlOiBIaWdoLXNwZWVkIG9yIExvdy1wb3dlcgogICAgICAoKykgQ29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wKICAgICAgKCspIENvbmZpZ3VyZSB0aGUgRFNJIFBIWSB0aW1lcgogICAgICAoKykgQ29uZmlndXJlIHRoZSBEU0kgSE9TVCB0aW1lb3V0CiAgICAgICgrKSBDb25maWd1cmUgdGhlIERTSSBIT1NUIHRpbWVvdXQKICAgICAgKCspIFN0YXJ0L1N0b3AgdGhlIERTSSBtb2R1bGUKICAgICAgKCspIFJlZnJlc2ggdGhlIGRpc3BsYXkgaW4gY29tbWFuZCBtb2RlCiAgICAgICgrKSBDb250cm9scyB0aGUgZGlzcGxheSBjb2xvciBtb2RlIGluIFZpZGVvIG1vZGUKICAgICAgKCspIENvbnRyb2wgdGhlIGRpc3BsYXkgc2h1dGRvd24gaW4gVmlkZW8gbW9kZQogICAgICAoKykgd3JpdGUgc2hvcnQgRENTIG9yIHNob3J0IEdlbmVyaWMgY29tbWFuZAogICAgICAoKykgd3JpdGUgbG9uZyBEQ1Mgb3IgbG9uZyBHZW5lcmljIGNvbW1hbmQKICAgICAgKCspIFJlYWQgY29tbWFuZCAoRENTIG9yIGdlbmVyaWMpCiAgICAgICgrKSBFbnRlci9FeGl0IHRoZSBVbHRyYSBMb3cgUG93ZXIgTW9kZSBvbiBkYXRhIG9ubHkgKEQtUEhZIFBMTCBydW5uaW5nKQogICAgICAoKykgRW50ZXIvRXhpdCB0aGUgVWx0cmEgTG93IFBvd2VyIE1vZGUgb24gZGF0YSBvbmx5IGFuZCBjbG9jayAoRC1QSFkgUExMIHR1cm5lZCBvZmYpCiAgICAgICgrKSBTdGFydC9TdG9wIHRlc3QgcGF0dGVybiBnZW5lcmF0aW9uCiAgICAgICgrKSBTbGV3LVJhdGUgQW5kIERlbGF5IFR1bmluZwogICAgICAoKykgTG93LVBvd2VyIFJlY2VwdGlvbiBGaWx0ZXIgVHVuaW5nCiAgICAgICgrKSBBY3RpdmF0ZSBhbiBhZGRpdGlvbmFsIGN1cnJlbnQgcGF0aCBvbiBhbGwgbGFuZXMgdG8gbWVldCB0aGUgU0REVHggcGFyYW1ldGVyCiAgICAgICgrKSBDdXN0b20gbGFuZSBwaW5zIGNvbmZpZ3VyYXRpb24KICAgICAgKCspIFNldCBjdXN0b20gdGltaW5nIGZvciB0aGUgUEhZCiAgICAgICgrKSBGb3JjZSB0aGUgQ2xvY2svRGF0YSBMYW5lIGluIFRYIFN0b3AgTW9kZQogICAgICAoKykgRm9yY2UgTFAgUmVjZWl2ZXIgaW4gTG93LVBvd2VyIE1vZGUKICAgICAgKCspIEZvcmNlIERhdGEgTGFuZXMgaW4gUlggTW9kZSBhZnRlciBhIEJUQQogICAgICAoKykgRW5hYmxlIGEgcHVsbC1kb3duIG9uIHRoZSBsYW5lcyB0byBwcmV2ZW50IGZyb20gZmxvYXRpbmcgc3RhdGVzIHdoZW4gdW51c2VkCiAgICAgICgrKSBTd2l0Y2ggb2ZmIHRoZSBjb250ZW50aW9uIGRldGVjdGlvbiBvbiBkYXRhIGxhbmVzCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBDb25maWd1cmUgdGhlIEdlbmVyaWMgaW50ZXJmYWNlIHJlYWQtYmFjayBWaXJ0dWFsIENoYW5uZWwgSUQuCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgVmlydHVhbENoYW5uZWxJRCAgVmlydHVhbCBjaGFubmVsIElECiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX1NldEdlbmVyaWNWQ0lEKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCB1aW50MzJfdCBWaXJ0dWFsQ2hhbm5lbElEKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBVcGRhdGUgdGhlIEdWQ0lEIHJlZ2lzdGVyICovCiAgaGRzaS0+SW5zdGFuY2UtPkdWQ0lEUiAmPSB+RFNJX0dWQ0lEUl9WQ0lEOwogIGhkc2ktPkluc3RhbmNlLT5HVkNJRFIgfD0gVmlydHVhbENoYW5uZWxJRDsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIFNlbGVjdCB2aWRlbyBtb2RlIGFuZCBjb25maWd1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycwogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIFZpZENmZyBwb2ludGVyIHRvIGEgRFNJX1ZpZENmZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBEU0kgdmlkZW8gbW9kZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfQ29uZmlnVmlkZW9Nb2RlKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCBEU0lfVmlkQ2ZnVHlwZURlZiAqVmlkQ2ZnKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19EU0lfQ09MT1JfQ09ESU5HKFZpZENmZy0+Q29sb3JDb2RpbmcpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX1ZJREVPX01PREVfVFlQRShWaWRDZmctPk1vZGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX0NPTU1BTkQoVmlkQ2ZnLT5MUENvbW1hbmRFbmFibGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX0hGUChWaWRDZmctPkxQSG9yaXpvbnRhbEZyb250UG9yY2hFbmFibGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX0hCUChWaWRDZmctPkxQSG9yaXpvbnRhbEJhY2tQb3JjaEVuYWJsZSkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfTFBfVkFDVElWRShWaWRDZmctPkxQVmVydGljYWxBY3RpdmVFbmFibGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX1ZGUChWaWRDZmctPkxQVmVydGljYWxGcm9udFBvcmNoRW5hYmxlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9WQlAoVmlkQ2ZnLT5MUFZlcnRpY2FsQmFja1BvcmNoRW5hYmxlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9WU1lOQyhWaWRDZmctPkxQVmVydGljYWxTeW5jQWN0aXZlRW5hYmxlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9GQlRBQShWaWRDZmctPkZyYW1lQlRBQWNrbm93bGVkZ2VFbmFibGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0RFX1BPTEFSSVRZKFZpZENmZy0+REVQb2xhcml0eSkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfVlNZTkNfUE9MQVJJVFkoVmlkQ2ZnLT5WU1BvbGFyaXR5KSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9IU1lOQ19QT0xBUklUWShWaWRDZmctPkhTUG9sYXJpdHkpKTsKICAvKiBDaGVjayB0aGUgTG9vc2VseVBhY2tlZCB2YXJpYW50IG9ubHkgaW4gMTgtYml0IG1vZGUgKi8KICBpZiAoVmlkQ2ZnLT5Db2xvckNvZGluZyA9PSBEU0lfUkdCNjY2KQogIHsKICAgIGFzc2VydF9wYXJhbShJU19EU0lfTE9PU0VMWV9QQUNLRUQoVmlkQ2ZnLT5Mb29zZWx5UGFja2VkKSk7CiAgfQoKICAvKiBTZWxlY3QgdmlkZW8gbW9kZSBieSByZXNldHRpbmcgQ01ETSBhbmQgRFNJTSBiaXRzICovCiAgaGRzaS0+SW5zdGFuY2UtPk1DUiAmPSB+RFNJX01DUl9DTURNOwogIGhkc2ktPkluc3RhbmNlLT5XQ0ZHUiAmPSB+RFNJX1dDRkdSX0RTSU07CgogIC8qIENvbmZpZ3VyZSB0aGUgdmlkZW8gbW9kZSB0cmFuc21pc3Npb24gdHlwZSAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9WTVQ7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5Nb2RlOwoKICAvKiBDb25maWd1cmUgdGhlIHZpZGVvIHBhY2tldCBzaXplICovCiAgaGRzaS0+SW5zdGFuY2UtPlZQQ1IgJj0gfkRTSV9WUENSX1ZQU0laRTsKICBoZHNpLT5JbnN0YW5jZS0+VlBDUiB8PSBWaWRDZmctPlBhY2tldFNpemU7CgogIC8qIFNldCB0aGUgY2h1bmtzIG51bWJlciB0byBiZSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZSBEU0kgbGluayAqLwogIGhkc2ktPkluc3RhbmNlLT5WQ0NSICY9IH5EU0lfVkNDUl9OVU1DOwogIGhkc2ktPkluc3RhbmNlLT5WQ0NSIHw9IFZpZENmZy0+TnVtYmVyT2ZDaHVua3M7CgogIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbnVsbCBwYWNrZXQgKi8KICBoZHNpLT5JbnN0YW5jZS0+Vk5QQ1IgJj0gfkRTSV9WTlBDUl9OUFNJWkU7CiAgaGRzaS0+SW5zdGFuY2UtPlZOUENSIHw9IFZpZENmZy0+TnVsbFBhY2tldFNpemU7CgogIC8qIFNlbGVjdCB0aGUgdmlydHVhbCBjaGFubmVsIGZvciB0aGUgTFREQyBpbnRlcmZhY2UgdHJhZmZpYyAqLwogIGhkc2ktPkluc3RhbmNlLT5MVkNJRFIgJj0gfkRTSV9MVkNJRFJfVkNJRDsKICBoZHNpLT5JbnN0YW5jZS0+TFZDSURSIHw9IFZpZENmZy0+VmlydHVhbENoYW5uZWxJRDsKCiAgLyogQ29uZmlndXJlIHRoZSBwb2xhcml0eSBvZiBjb250cm9sIHNpZ25hbHMgKi8KICBoZHNpLT5JbnN0YW5jZS0+TFBDUiAmPSB+KERTSV9MUENSX0RFUCB8IERTSV9MUENSX1ZTUCB8IERTSV9MUENSX0hTUCk7CiAgaGRzaS0+SW5zdGFuY2UtPkxQQ1IgfD0gKFZpZENmZy0+REVQb2xhcml0eSB8IFZpZENmZy0+VlNQb2xhcml0eSB8IFZpZENmZy0+SFNQb2xhcml0eSk7CgogIC8qIFNlbGVjdCB0aGUgY29sb3IgY29kaW5nIGZvciB0aGUgaG9zdCAqLwogIGhkc2ktPkluc3RhbmNlLT5MQ09MQ1IgJj0gfkRTSV9MQ09MQ1JfQ09MQzsKICBoZHNpLT5JbnN0YW5jZS0+TENPTENSIHw9IFZpZENmZy0+Q29sb3JDb2Rpbmc7CgogIC8qIFNlbGVjdCB0aGUgY29sb3IgY29kaW5nIGZvciB0aGUgd3JhcHBlciAqLwogIGhkc2ktPkluc3RhbmNlLT5XQ0ZHUiAmPSB+RFNJX1dDRkdSX0NPTE1VWDsKICBoZHNpLT5JbnN0YW5jZS0+V0NGR1IgfD0gKChWaWRDZmctPkNvbG9yQ29kaW5nKSA8PCAxVSk7CgogIC8qIEVuYWJsZS9kaXNhYmxlIHRoZSBsb29zZWx5IHBhY2tlZCB2YXJpYW50IHRvIDE4LWJpdCBjb25maWd1cmF0aW9uICovCiAgaWYgKFZpZENmZy0+Q29sb3JDb2RpbmcgPT0gRFNJX1JHQjY2NikKICB7CiAgICBoZHNpLT5JbnN0YW5jZS0+TENPTENSICY9IH5EU0lfTENPTENSX0xQRTsKICAgIGhkc2ktPkluc3RhbmNlLT5MQ09MQ1IgfD0gVmlkQ2ZnLT5Mb29zZWx5UGFja2VkOwogIH0KCiAgLyogU2V0IHRoZSBIb3Jpem9udGFsIFN5bmNocm9uaXphdGlvbiBBY3RpdmUgKEhTQSkgaW4gbGFuZSBieXRlIGNsb2NrIGN5Y2xlcyAqLwogIGhkc2ktPkluc3RhbmNlLT5WSFNBQ1IgJj0gfkRTSV9WSFNBQ1JfSFNBOwogIGhkc2ktPkluc3RhbmNlLT5WSFNBQ1IgfD0gVmlkQ2ZnLT5Ib3Jpem9udGFsU3luY0FjdGl2ZTsKCiAgLyogU2V0IHRoZSBIb3Jpem9udGFsIEJhY2sgUG9yY2ggKEhCUCkgaW4gbGFuZSBieXRlIGNsb2NrIGN5Y2xlcyAqLwogIGhkc2ktPkluc3RhbmNlLT5WSEJQQ1IgJj0gfkRTSV9WSEJQQ1JfSEJQOwogIGhkc2ktPkluc3RhbmNlLT5WSEJQQ1IgfD0gVmlkQ2ZnLT5Ib3Jpem9udGFsQmFja1BvcmNoOwoKICAvKiBTZXQgdGhlIHRvdGFsIGxpbmUgdGltZSAoSExJTkU9SFNBK0hCUCtIQUNUK0hGUCkgaW4gbGFuZSBieXRlIGNsb2NrIGN5Y2xlcyAqLwogIGhkc2ktPkluc3RhbmNlLT5WTENSICY9IH5EU0lfVkxDUl9ITElORTsKICBoZHNpLT5JbnN0YW5jZS0+VkxDUiB8PSBWaWRDZmctPkhvcml6b250YWxMaW5lOwoKICAvKiBTZXQgdGhlIFZlcnRpY2FsIFN5bmNocm9uaXphdGlvbiBBY3RpdmUgKFZTQSkgKi8KICBoZHNpLT5JbnN0YW5jZS0+VlZTQUNSICY9IH5EU0lfVlZTQUNSX1ZTQTsKICBoZHNpLT5JbnN0YW5jZS0+VlZTQUNSIHw9IFZpZENmZy0+VmVydGljYWxTeW5jQWN0aXZlOwoKICAvKiBTZXQgdGhlIFZlcnRpY2FsIEJhY2sgUG9yY2ggKFZCUCkqLwogIGhkc2ktPkluc3RhbmNlLT5WVkJQQ1IgJj0gfkRTSV9WVkJQQ1JfVkJQOwogIGhkc2ktPkluc3RhbmNlLT5WVkJQQ1IgfD0gVmlkQ2ZnLT5WZXJ0aWNhbEJhY2tQb3JjaDsKCiAgLyogU2V0IHRoZSBWZXJ0aWNhbCBGcm9udCBQb3JjaCAoVkZQKSovCiAgaGRzaS0+SW5zdGFuY2UtPlZWRlBDUiAmPSB+RFNJX1ZWRlBDUl9WRlA7CiAgaGRzaS0+SW5zdGFuY2UtPlZWRlBDUiB8PSBWaWRDZmctPlZlcnRpY2FsRnJvbnRQb3JjaDsKCiAgLyogU2V0IHRoZSBWZXJ0aWNhbCBBY3RpdmUgcGVyaW9kKi8KICBoZHNpLT5JbnN0YW5jZS0+VlZBQ1IgJj0gfkRTSV9WVkFDUl9WQTsKICBoZHNpLT5JbnN0YW5jZS0+VlZBQ1IgfD0gVmlkQ2ZnLT5WZXJ0aWNhbEFjdGl2ZTsKCiAgLyogQ29uZmlndXJlIHRoZSBjb21tYW5kIHRyYW5zbWlzc2lvbiBtb2RlICovCiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgJj0gfkRTSV9WTUNSX0xQQ0U7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5MUENvbW1hbmRFbmFibGU7CgogIC8qIExvdyBwb3dlciBsYXJnZXN0IHBhY2tldCBzaXplICovCiAgaGRzaS0+SW5zdGFuY2UtPkxQTUNSICY9IH5EU0lfTFBNQ1JfTFBTSVpFOwogIGhkc2ktPkluc3RhbmNlLT5MUE1DUiB8PSAoKFZpZENmZy0+TFBMYXJnZXN0UGFja2V0U2l6ZSkgPDwgMTZVKTsKCiAgLyogTG93IHBvd2VyIFZBQ1QgbGFyZ2VzdCBwYWNrZXQgc2l6ZSAqLwogIGhkc2ktPkluc3RhbmNlLT5MUE1DUiAmPSB+RFNJX0xQTUNSX1ZMUFNJWkU7CiAgaGRzaS0+SW5zdGFuY2UtPkxQTUNSIHw9IFZpZENmZy0+TFBWQUNUTGFyZ2VzdFBhY2tldFNpemU7CgogIC8qIEVuYWJsZSBMUCB0cmFuc2l0aW9uIGluIEhGUCBwZXJpb2QgKi8KICBoZHNpLT5JbnN0YW5jZS0+Vk1DUiAmPSB+RFNJX1ZNQ1JfTFBIRlBFOwogIGhkc2ktPkluc3RhbmNlLT5WTUNSIHw9IFZpZENmZy0+TFBIb3Jpem9udGFsRnJvbnRQb3JjaEVuYWJsZTsKCiAgLyogRW5hYmxlIExQIHRyYW5zaXRpb24gaW4gSEJQIHBlcmlvZCAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9MUEhCUEU7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5MUEhvcml6b250YWxCYWNrUG9yY2hFbmFibGU7CgogIC8qIEVuYWJsZSBMUCB0cmFuc2l0aW9uIGluIFZBQ1QgcGVyaW9kICovCiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgJj0gfkRTSV9WTUNSX0xQVkFFOwogIGhkc2ktPkluc3RhbmNlLT5WTUNSIHw9IFZpZENmZy0+TFBWZXJ0aWNhbEFjdGl2ZUVuYWJsZTsKCiAgLyogRW5hYmxlIExQIHRyYW5zaXRpb24gaW4gVkZQIHBlcmlvZCAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9MUFZGUEU7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5MUFZlcnRpY2FsRnJvbnRQb3JjaEVuYWJsZTsKCiAgLyogRW5hYmxlIExQIHRyYW5zaXRpb24gaW4gVkJQIHBlcmlvZCAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9MUFZCUEU7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5MUFZlcnRpY2FsQmFja1BvcmNoRW5hYmxlOwoKICAvKiBFbmFibGUgTFAgdHJhbnNpdGlvbiBpbiB2ZXJ0aWNhbCBzeW5jIHBlcmlvZCAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9MUFZTQUU7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gVmlkQ2ZnLT5MUFZlcnRpY2FsU3luY0FjdGl2ZUVuYWJsZTsKCiAgLyogRW5hYmxlIHRoZSByZXF1ZXN0IGZvciBhbiBhY2tub3dsZWRnZSByZXNwb25zZSBhdCB0aGUgZW5kIG9mIGEgZnJhbWUgKi8KICBoZHNpLT5JbnN0YW5jZS0+Vk1DUiAmPSB+RFNJX1ZNQ1JfRkJUQUFFOwogIGhkc2ktPkluc3RhbmNlLT5WTUNSIHw9IFZpZENmZy0+RnJhbWVCVEFBY2tub3dsZWRnZUVuYWJsZTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIFNlbGVjdCBhZGFwdGVkIGNvbW1hbmQgbW9kZSBhbmQgY29uZmlndXJlIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBDbWRDZmcgIHBvaW50ZXIgdG8gYSBEU0lfQ21kQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgIHRoZSBEU0kgY29tbWFuZCBtb2RlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9Db25maWdBZGFwdGVkQ29tbWFuZE1vZGUoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIERTSV9DbWRDZmdUeXBlRGVmICpDbWRDZmcpCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9DT0xPUl9DT0RJTkcoQ21kQ2ZnLT5Db2xvckNvZGluZykpOwogIGFzc2VydF9wYXJhbShJU19EU0lfVEVfU09VUkNFKENtZENmZy0+VGVhcmluZ0VmZmVjdFNvdXJjZSkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfVEVfUE9MQVJJVFkoQ21kQ2ZnLT5UZWFyaW5nRWZmZWN0UG9sYXJpdHkpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0FVVE9NQVRJQ19SRUZSRVNIKENtZENmZy0+QXV0b21hdGljUmVmcmVzaCkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfVlNfUE9MQVJJVFkoQ21kQ2ZnLT5WU3luY1BvbCkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfVEVfQUNLX1JFUVVFU1QoQ21kQ2ZnLT5URUFja25vd2xlZGdlUmVxdWVzdCkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfREVfUE9MQVJJVFkoQ21kQ2ZnLT5ERVBvbGFyaXR5KSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9WU1lOQ19QT0xBUklUWShDbWRDZmctPlZTUG9sYXJpdHkpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0hTWU5DX1BPTEFSSVRZKENtZENmZy0+SFNQb2xhcml0eSkpOwoKICAvKiBTZWxlY3QgY29tbWFuZCBtb2RlIGJ5IHNldHRpbmcgQ01ETSBhbmQgRFNJTSBiaXRzICovCiAgaGRzaS0+SW5zdGFuY2UtPk1DUiB8PSBEU0lfTUNSX0NNRE07CiAgaGRzaS0+SW5zdGFuY2UtPldDRkdSICY9IH5EU0lfV0NGR1JfRFNJTTsKICBoZHNpLT5JbnN0YW5jZS0+V0NGR1IgfD0gRFNJX1dDRkdSX0RTSU07CgogIC8qIFNlbGVjdCB0aGUgdmlydHVhbCBjaGFubmVsIGZvciB0aGUgTFREQyBpbnRlcmZhY2UgdHJhZmZpYyAqLwogIGhkc2ktPkluc3RhbmNlLT5MVkNJRFIgJj0gfkRTSV9MVkNJRFJfVkNJRDsKICBoZHNpLT5JbnN0YW5jZS0+TFZDSURSIHw9IENtZENmZy0+VmlydHVhbENoYW5uZWxJRDsKCiAgLyogQ29uZmlndXJlIHRoZSBwb2xhcml0eSBvZiBjb250cm9sIHNpZ25hbHMgKi8KICBoZHNpLT5JbnN0YW5jZS0+TFBDUiAmPSB+KERTSV9MUENSX0RFUCB8IERTSV9MUENSX1ZTUCB8IERTSV9MUENSX0hTUCk7CiAgaGRzaS0+SW5zdGFuY2UtPkxQQ1IgfD0gKENtZENmZy0+REVQb2xhcml0eSB8IENtZENmZy0+VlNQb2xhcml0eSB8IENtZENmZy0+SFNQb2xhcml0eSk7CgogIC8qIFNlbGVjdCB0aGUgY29sb3IgY29kaW5nIGZvciB0aGUgaG9zdCAqLwogIGhkc2ktPkluc3RhbmNlLT5MQ09MQ1IgJj0gfkRTSV9MQ09MQ1JfQ09MQzsKICBoZHNpLT5JbnN0YW5jZS0+TENPTENSIHw9IENtZENmZy0+Q29sb3JDb2Rpbmc7CgogIC8qIFNlbGVjdCB0aGUgY29sb3IgY29kaW5nIGZvciB0aGUgd3JhcHBlciAqLwogIGhkc2ktPkluc3RhbmNlLT5XQ0ZHUiAmPSB+RFNJX1dDRkdSX0NPTE1VWDsKICBoZHNpLT5JbnN0YW5jZS0+V0NGR1IgfD0gKChDbWRDZmctPkNvbG9yQ29kaW5nKSA8PCAxVSk7CgogIC8qIENvbmZpZ3VyZSB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUgZm9yIHdyaXRlIG1lbW9yeSBjb21tYW5kICovCiAgaGRzaS0+SW5zdGFuY2UtPkxDQ1IgJj0gfkRTSV9MQ0NSX0NNRFNJWkU7CiAgaGRzaS0+SW5zdGFuY2UtPkxDQ1IgfD0gQ21kQ2ZnLT5Db21tYW5kU2l6ZTsKCiAgLyogQ29uZmlndXJlIHRoZSB0ZWFyaW5nIGVmZmVjdCBzb3VyY2UgYW5kIHBvbGFyaXR5IGFuZCBzZWxlY3QgdGhlIHJlZnJlc2ggbW9kZSAqLwogIGhkc2ktPkluc3RhbmNlLT5XQ0ZHUiAmPSB+KERTSV9XQ0ZHUl9URVNSQyB8IERTSV9XQ0ZHUl9URVBPTCB8IERTSV9XQ0ZHUl9BUiB8IERTSV9XQ0ZHUl9WU1BPTCk7CiAgaGRzaS0+SW5zdGFuY2UtPldDRkdSIHw9IChDbWRDZmctPlRlYXJpbmdFZmZlY3RTb3VyY2UgfCBDbWRDZmctPlRlYXJpbmdFZmZlY3RQb2xhcml0eSB8IENtZENmZy0+QXV0b21hdGljUmVmcmVzaCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbWRDZmctPlZTeW5jUG9sKTsKCiAgLyogQ29uZmlndXJlIHRoZSB0ZWFyaW5nIGVmZmVjdCBhY2tub3dsZWRnZSByZXF1ZXN0ICovCiAgaGRzaS0+SW5zdGFuY2UtPkNNQ1IgJj0gfkRTSV9DTUNSX1RFQVJFOwogIGhkc2ktPkluc3RhbmNlLT5DTUNSIHw9IENtZENmZy0+VEVBY2tub3dsZWRnZVJlcXVlc3Q7CgogIC8qIEVuYWJsZSB0aGUgVGVhcmluZyBFZmZlY3QgaW50ZXJydXB0ICovCiAgX19IQUxfRFNJX0VOQUJMRV9JVChoZHNpLCBEU0lfSVRfVEUpOwoKICAvKiBFbmFibGUgdGhlIEVuZCBvZiBSZWZyZXNoIGludGVycnVwdCAqLwogIF9fSEFMX0RTSV9FTkFCTEVfSVQoaGRzaSwgRFNJX0lUX0VSKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSBjb21tYW5kIHRyYW5zbWlzc2lvbiBtb2RlOiBIaWdoLXNwZWVkIG9yIExvdy1wb3dlcgogICogICAgICAgICBhbmQgZW5hYmxlL2Rpc2FibGUgYWNrbm93bGVkZ2UgcmVxdWVzdCBhZnRlciBwYWNrZXQgdHJhbnNtaXNzaW9uCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgTFBDbWQgIHBvaW50ZXIgdG8gYSBEU0lfTFBDbWRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgRFNJIGNvbW1hbmQgdHJhbnNtaXNzaW9uIG1vZGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX0NvbmZpZ0NvbW1hbmQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIERTSV9MUENtZFR5cGVEZWYgKkxQQ21kKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX0dTVzBQKExQQ21kLT5MUEdlblNob3J0V3JpdGVOb1ApKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0xQX0dTVzFQKExQQ21kLT5MUEdlblNob3J0V3JpdGVPbmVQKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9HU1cyUChMUENtZC0+TFBHZW5TaG9ydFdyaXRlVHdvUCkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfTFBfR1NSMFAoTFBDbWQtPkxQR2VuU2hvcnRSZWFkTm9QKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9HU1IxUChMUENtZC0+TFBHZW5TaG9ydFJlYWRPbmVQKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9HU1IyUChMUENtZC0+TFBHZW5TaG9ydFJlYWRUd29QKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9HTFcoTFBDbWQtPkxQR2VuTG9uZ1dyaXRlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9EU1cwUChMUENtZC0+TFBEY3NTaG9ydFdyaXRlTm9QKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9EU1cxUChMUENtZC0+TFBEY3NTaG9ydFdyaXRlT25lUCkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfTFBfRFNSMFAoTFBDbWQtPkxQRGNzU2hvcnRSZWFkTm9QKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9ETFcoTFBDbWQtPkxQRGNzTG9uZ1dyaXRlKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MUF9NUkRQKExQQ21kLT5MUE1heFJlYWRQYWNrZXQpKTsKICBhc3NlcnRfcGFyYW0oSVNfRFNJX0FDS19SRVFVRVNUKExQQ21kLT5BY2tub3dsZWRnZVJlcXVlc3QpKTsKCiAgLyogU2VsZWN0IEhpZ2gtc3BlZWQgb3IgTG93LXBvd2VyIGZvciBjb21tYW5kIHRyYW5zbWlzc2lvbiAqLwogIGhkc2ktPkluc3RhbmNlLT5DTUNSICY9IH4oRFNJX0NNQ1JfR1NXMFRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR1NXMVRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR1NXMlRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR1NSMFRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR1NSMVRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR1NSMlRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfR0xXVFggIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfRFNXMFRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfRFNXMVRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfRFNSMFRYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfRExXVFggIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJX0NNQ1JfTVJEUFMpOwogIGhkc2ktPkluc3RhbmNlLT5DTUNSIHw9IChMUENtZC0+TFBHZW5TaG9ydFdyaXRlTm9QICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDbWQtPkxQR2VuU2hvcnRXcml0ZU9uZVAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ21kLT5MUEdlblNob3J0V3JpdGVUd29QIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICBMUENtZC0+TFBHZW5TaG9ydFJlYWROb1AgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDbWQtPkxQR2VuU2hvcnRSZWFkT25lUCAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ21kLT5MUEdlblNob3J0UmVhZFR3b1AgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICBMUENtZC0+TFBHZW5Mb25nV3JpdGUgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDbWQtPkxQRGNzU2hvcnRXcml0ZU5vUCAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ21kLT5MUERjc1Nob3J0V3JpdGVPbmVQIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICBMUENtZC0+TFBEY3NTaG9ydFJlYWROb1AgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDbWQtPkxQRGNzTG9uZ1dyaXRlICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ21kLT5MUE1heFJlYWRQYWNrZXQpOwoKICAvKiBDb25maWd1cmUgdGhlIGFja25vd2xlZGdlIHJlcXVlc3QgYWZ0ZXIgZWFjaCBwYWNrZXQgdHJhbnNtaXNzaW9uICovCiAgaGRzaS0+SW5zdGFuY2UtPkNNQ1IgJj0gfkRTSV9DTUNSX0FSRTsKICBoZHNpLT5JbnN0YW5jZS0+Q01DUiB8PSBMUENtZC0+QWNrbm93bGVkZ2VSZXF1ZXN0OwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wgcGFyYW1ldGVycwogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIEZsb3dDb250cm9sICBmbG93IGNvbnRyb2wgZmVhdHVyZShzKSB0byBiZSBlbmFibGVkLgogICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBAYXJnIERTSV9GbG93Q29udHJvbC4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfQ29uZmlnRmxvd0NvbnRyb2woRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IEZsb3dDb250cm9sKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19EU0lfRkxPV19DT05UUk9MKEZsb3dDb250cm9sKSk7CgogIC8qIFNldCB0aGUgRFNJIEhvc3QgUHJvdG9jb2wgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogIGhkc2ktPkluc3RhbmNlLT5QQ1IgJj0gfkRTSV9GTE9XX0NPTlRST0xfQUxMOwogIGhkc2ktPkluc3RhbmNlLT5QQ1IgfD0gRmxvd0NvbnRyb2w7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBDb25maWd1cmUgdGhlIERTSSBQSFkgdGltZXIgcGFyYW1ldGVycwogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIFBoeVRpbWVycyAgRFNJX1BIWV9UaW1lclR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgICAgICB0aGUgRFNJIFBIWSB0aW1pbmcgcGFyYW1ldGVycwogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9Db25maWdQaHlUaW1lcihEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgRFNJX1BIWV9UaW1lclR5cGVEZWYgKlBoeVRpbWVycykKewogIHVpbnQzMl90IG1heFRpbWU7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICBtYXhUaW1lID0gKFBoeVRpbWVycy0+Q2xvY2tMYW5lTFAySFNUaW1lID4gUGh5VGltZXJzLT5DbG9ja0xhbmVIUzJMUFRpbWUpID8gUGh5VGltZXJzLT5DbG9ja0xhbmVMUDJIU1RpbWUgOgogICAgICAgICAgICBQaHlUaW1lcnMtPkNsb2NrTGFuZUhTMkxQVGltZTsKCiAgLyogQ2xvY2sgbGFuZSB0aW1lciBjb25maWd1cmF0aW9uICovCgogIC8qIEluIEF1dG9tYXRpYyBDbG9jayBMYW5lIGNvbnRyb2wgbW9kZSwgdGhlIERTSSBIb3N0IGNhbiB0dXJuIG9mZiB0aGUgY2xvY2sgbGFuZSBiZXR3ZWVuIHR3bwogICAgIEhpZ2gtU3BlZWQgdHJhbnNtaXNzaW9uLgogICAgIFRvIGRvIHNvLCB0aGUgRFNJIEhvc3QgY2FsY3VsYXRlcyB0aGUgdGltZSByZXF1aXJlZCBmb3IgdGhlIGNsb2NrIGxhbmUgdG8gY2hhbmdlIGZyb20gSGlnaFNwZWVkCiAgICAgdG8gTG93LVBvd2VyIGFuZCBmcm9tIExvdy1Qb3dlciB0byBIaWdoLVNwZWVkLgogICAgIFRoaXMgdGltaW5ncyBhcmUgY29uZmlndXJlZCBieSB0aGUgSFMyTFBfVElNRSBhbmQgTFAySFNfVElNRSBpbiB0aGUgRFNJIEhvc3QgQ2xvY2sgTGFuZSBUaW1lciBDb25maWd1cmF0aW9uCiAgICAgUmVnaXN0ZXIgKERTSV9DTFRDUikuCiAgICAgQnV0IHRoZSBEU0kgSG9zdCBpcyBub3QgY2FsY3VsYXRpbmcgTFAySFNfVElNRSArIEhTMkxQX1RJTUUgYnV0IDIgeCBIUzJMUF9USU1FLgoKICAgICBXb3JrYXJvdW5kIDogQ29uZmlndXJlIEhTMkxQX1RJTUUgYW5kIExQMkhTX1RJTUUgd2l0aCB0aGUgc2FtZSB2YWx1ZSBiZWluZyB0aGUgbWF4IG9mIEhTMkxQX1RJTUUgb3IgTFAySFNfVElNRS4KICAgICovCiAgaGRzaS0+SW5zdGFuY2UtPkNMVENSICY9IH4oRFNJX0NMVENSX0xQMkhTX1RJTUUgfCBEU0lfQ0xUQ1JfSFMyTFBfVElNRSk7CiAgaGRzaS0+SW5zdGFuY2UtPkNMVENSIHw9IChtYXhUaW1lIHwgKChtYXhUaW1lKSA8PCAxNlUpKTsKCiAgLyogRGF0YSBsYW5lIHRpbWVyIGNvbmZpZ3VyYXRpb24gKi8KICBoZHNpLT5JbnN0YW5jZS0+RExUQ1IgJj0gfihEU0lfRExUQ1JfTVJEX1RJTUUgfCBEU0lfRExUQ1JfTFAySFNfVElNRSB8IERTSV9ETFRDUl9IUzJMUF9USU1FKTsKICBoZHNpLT5JbnN0YW5jZS0+RExUQ1IgfD0gKFBoeVRpbWVycy0+RGF0YUxhbmVNYXhSZWFkVGltZSB8ICgoUGh5VGltZXJzLT5EYXRhTGFuZUxQMkhTVGltZSkgPDwgMTZVKSB8ICgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeVRpbWVycy0+RGF0YUxhbmVIUzJMUFRpbWUpIDw8IDI0VSkpOwoKICAvKiBDb25maWd1cmUgdGhlIHdhaXQgcGVyaW9kIHRvIHJlcXVlc3QgSFMgdHJhbnNtaXNzaW9uIGFmdGVyIGEgc3RvcCBzdGF0ZSAqLwogIGhkc2ktPkluc3RhbmNlLT5QQ09ORlIgJj0gfkRTSV9QQ09ORlJfU1dfVElNRTsKICBoZHNpLT5JbnN0YW5jZS0+UENPTkZSIHw9ICgoUGh5VGltZXJzLT5TdG9wV2FpdFRpbWUpIDw8IDhVKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgRFNJIEhPU1QgdGltZW91dCBwYXJhbWV0ZXJzCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgSG9zdFRpbWVvdXRzICBEU0lfSE9TVF9UaW1lb3V0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBEU0kgaG9zdCB0aW1lb3V0IHBhcmFtZXRlcnMKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfQ29uZmlnSG9zdFRpbWVvdXRzKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCBEU0lfSE9TVF9UaW1lb3V0VHlwZURlZiAqSG9zdFRpbWVvdXRzKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBTZXQgdGhlIHRpbWVvdXQgY2xvY2sgZGl2aXNpb24gZmFjdG9yICovCiAgaGRzaS0+SW5zdGFuY2UtPkNDUiAmPSB+RFNJX0NDUl9UT0NLRElWOwogIGhkc2ktPkluc3RhbmNlLT5DQ1IgfD0gKChIb3N0VGltZW91dHMtPlRpbWVvdXRDa2RpdikgPDwgOFUpOwoKICAvKiBIaWdoLXNwZWVkIHRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCiAgaGRzaS0+SW5zdGFuY2UtPlRDQ1JbMFVdICY9IH5EU0lfVENDUjBfSFNUWF9UT0NOVDsKICBoZHNpLT5JbnN0YW5jZS0+VENDUlswVV0gfD0gKChIb3N0VGltZW91dHMtPkhpZ2hTcGVlZFRyYW5zbWlzc2lvblRpbWVvdXQpIDw8IDE2VSk7CgogIC8qIExvdy1wb3dlciByZWNlcHRpb24gdGltZW91dCAqLwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzBVXSAmPSB+RFNJX1RDQ1IwX0xQUlhfVE9DTlQ7CiAgaGRzaS0+SW5zdGFuY2UtPlRDQ1JbMFVdIHw9IEhvc3RUaW1lb3V0cy0+TG93UG93ZXJSZWNlcHRpb25UaW1lb3V0OwoKICAvKiBIaWdoLXNwZWVkIHJlYWQgdGltZW91dCAqLwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzFVXSAmPSB+RFNJX1RDQ1IxX0hTUkRfVE9DTlQ7CiAgaGRzaS0+SW5zdGFuY2UtPlRDQ1JbMVVdIHw9IEhvc3RUaW1lb3V0cy0+SGlnaFNwZWVkUmVhZFRpbWVvdXQ7CgogIC8qIExvdy1wb3dlciByZWFkIHRpbWVvdXQgKi8KICBoZHNpLT5JbnN0YW5jZS0+VENDUlsyVV0gJj0gfkRTSV9UQ0NSMl9MUFJEX1RPQ05UOwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzJVXSB8PSBIb3N0VGltZW91dHMtPkxvd1Bvd2VyUmVhZFRpbWVvdXQ7CgogIC8qIEhpZ2gtc3BlZWQgd3JpdGUgdGltZW91dCAqLwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzNVXSAmPSB+RFNJX1RDQ1IzX0hTV1JfVE9DTlQ7CiAgaGRzaS0+SW5zdGFuY2UtPlRDQ1JbM1VdIHw9IEhvc3RUaW1lb3V0cy0+SGlnaFNwZWVkV3JpdGVUaW1lb3V0OwoKICAvKiBIaWdoLXNwZWVkIHdyaXRlIHByZXNwIG1vZGUgKi8KICBoZHNpLT5JbnN0YW5jZS0+VENDUlszVV0gJj0gfkRTSV9UQ0NSM19QTTsKICBoZHNpLT5JbnN0YW5jZS0+VENDUlszVV0gfD0gSG9zdFRpbWVvdXRzLT5IaWdoU3BlZWRXcml0ZVByZXNwTW9kZTsKCiAgLyogTG93LXNwZWVkIHdyaXRlIHRpbWVvdXQgKi8KICBoZHNpLT5JbnN0YW5jZS0+VENDUls0VV0gJj0gfkRTSV9UQ0NSNF9MUFdSX1RPQ05UOwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzRVXSB8PSBIb3N0VGltZW91dHMtPkxvd1Bvd2VyV3JpdGVUaW1lb3V0OwoKICAvKiBCVEEgdGltZW91dCAqLwogIGhkc2ktPkluc3RhbmNlLT5UQ0NSWzVVXSAmPSB+RFNJX1RDQ1I1X0JUQV9UT0NOVDsKICBoZHNpLT5JbnN0YW5jZS0+VENDUls1VV0gfD0gSG9zdFRpbWVvdXRzLT5CVEFUaW1lb3V0OwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU3RhcnQgdGhlIERTSSBtb2R1bGUKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9TdGFydChEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogRW5hYmxlIHRoZSBEU0kgaG9zdCAqLwogIF9fSEFMX0RTSV9FTkFCTEUoaGRzaSk7CgogIC8qIEVuYWJsZSB0aGUgRFNJIHdyYXBwZXIgKi8KICBfX0hBTF9EU0lfV1JBUFBFUl9FTkFCTEUoaGRzaSk7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBTdG9wIHRoZSBEU0kgbW9kdWxlCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfU3RvcChEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogRGlzYWJsZSB0aGUgRFNJIGhvc3QgKi8KICBfX0hBTF9EU0lfRElTQUJMRShoZHNpKTsKCiAgLyogRGlzYWJsZSB0aGUgRFNJIHdyYXBwZXIgKi8KICBfX0hBTF9EU0lfV1JBUFBFUl9ESVNBQkxFKGhkc2kpOwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgUmVmcmVzaCB0aGUgZGlzcGxheSBpbiBjb21tYW5kIG1vZGUKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9SZWZyZXNoKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBVcGRhdGUgdGhlIGRpc3BsYXkgKi8KICBoZHNpLT5JbnN0YW5jZS0+V0NSIHw9IERTSV9XQ1JfTFREQ0VOOwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgQ29udHJvbHMgdGhlIGRpc3BsYXkgY29sb3IgbW9kZSBpbiBWaWRlbyBtb2RlCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgQ29sb3JNb2RlICBDb2xvciBtb2RlIChmdWxsIG9yIDgtY29sb3JzKS4KICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEBhcmcgRFNJX0NvbG9yX01vZGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfQ29sb3JNb2RlKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCB1aW50MzJfdCBDb2xvck1vZGUpCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9DT0xPUl9NT0RFKENvbG9yTW9kZSkpOwoKICAvKiBVcGRhdGUgdGhlIGRpc3BsYXkgY29sb3IgbW9kZSAqLwogIGhkc2ktPkluc3RhbmNlLT5XQ1IgJj0gfkRTSV9XQ1JfQ09MTTsKICBoZHNpLT5JbnN0YW5jZS0+V0NSIHw9IENvbG9yTW9kZTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIENvbnRyb2wgdGhlIGRpc3BsYXkgc2h1dGRvd24gaW4gVmlkZW8gbW9kZQogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIFNodXRkb3duICBTaHV0LWRvd24gKERpc3BsYXktT04gb3IgRGlzcGxheS1PRkYpLgogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9TaHV0RG93bgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9TaHV0ZG93bihEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgdWludDMyX3QgU2h1dGRvd24pCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9TSFVUX0RPV04oU2h1dGRvd24pKTsKCiAgLyogVXBkYXRlIHRoZSBkaXNwbGF5IFNodXRkb3duICovCiAgaGRzaS0+SW5zdGFuY2UtPldDUiAmPSB+RFNJX1dDUl9TSFRETjsKICBoZHNpLT5JbnN0YW5jZS0+V0NSIHw9IFNodXRkb3duOwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgd3JpdGUgc2hvcnQgRENTIG9yIHNob3J0IEdlbmVyaWMgY29tbWFuZAogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIENoYW5uZWxJRCAgVmlydHVhbCBjaGFubmVsIElELgogICogQHBhcmFtICBNb2RlICBEU0kgc2hvcnQgcGFja2V0IGRhdGEgdHlwZS4KICAqICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9TSE9SVF9XUklURV9QS1RfRGF0YV9UeXBlLgogICogQHBhcmFtICBQYXJhbTEgIERTQyBjb21tYW5kIG9yIGZpcnN0IGdlbmVyaWMgcGFyYW1ldGVyLgogICogICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQGFyZyBEU0lfRENTX0NvbW1hbmQgb3IgYQogICogICAgICAgICAgICAgICAgIGdlbmVyaWMgY29tbWFuZCBjb2RlLgogICogQHBhcmFtICBQYXJhbTIgIERTQyBwYXJhbWV0ZXIgb3Igc2Vjb25kIGdlbmVyaWMgcGFyYW1ldGVyLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9TaG9ydFdyaXRlKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBhcmFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFBhcmFtMikKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19EU0lfU0hPUlRfV1JJVEVfUEFDS0VUX1RZUEUoTW9kZSkpOwoKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIHN0YXR1cyA9IERTSV9TaG9ydFdyaXRlKGhkc2ksIENoYW5uZWxJRCwgTW9kZSwgUGFyYW0xLCBQYXJhbTIpOwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgd3JpdGUgbG9uZyBEQ1Mgb3IgbG9uZyBHZW5lcmljIGNvbW1hbmQKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBDaGFubmVsSUQgIFZpcnR1YWwgY2hhbm5lbCBJRC4KICAqIEBwYXJhbSAgTW9kZSAgRFNJIGxvbmcgcGFja2V0IGRhdGEgdHlwZS4KICAqICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9MT05HX1dSSVRFX1BLVF9EYXRhX1R5cGUuCiAgKiBAcGFyYW0gIE5iUGFyYW1zICBOdW1iZXIgb2YgcGFyYW1ldGVycy4KICAqIEBwYXJhbSAgUGFyYW0xICBEU0MgY29tbWFuZCBvciBmaXJzdCBnZW5lcmljIHBhcmFtZXRlci4KICAqICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEBhcmcgRFNJX0RDU19Db21tYW5kIG9yIGEKICAqICAgICAgICAgICAgICAgICBnZW5lcmljIGNvbW1hbmQgY29kZQogICogQHBhcmFtICBQYXJhbWV0ZXJzVGFibGUgIFBvaW50ZXIgdG8gcGFyYW1ldGVyIHZhbHVlcyB0YWJsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfTG9uZ1dyaXRlKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFubmVsSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5iUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBQYXJhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKlBhcmFtZXRlcnNUYWJsZSkKewogIHVpbnQzMl90IHVpY291bnRlcjsKICB1aW50MzJfdCBuYkJ5dGVzOwogIHVpbnQzMl90IGNvdW50OwogIHVpbnQzMl90IHRpY2tzdGFydDsKICB1aW50MzJfdCBmaWZvd29yZDsKICB1aW50OF90ICpwcGFyYW1zID0gUGFyYW1ldGVyc1RhYmxlOwoKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MT05HX1dSSVRFX1BBQ0tFVF9UWVBFKE1vZGUpKTsKCiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAvKiBXYWl0IGZvciBDb21tYW5kIEZJRk8gRW1wdHkgKi8KICB3aGlsZSAoKGhkc2ktPkluc3RhbmNlLT5HUFNSICYgRFNJX0dQU1JfQ01ERkUpID09IDBVKQogIHsKICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IERTSV9USU1FT1VUX1ZBTFVFKQogICAgewogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgIH0KICB9CgogIC8qIFNldCB0aGUgRENTIGNvZGUgb24gcGF5bG9hZCBieXRlIDEsIGFuZCB0aGUgb3RoZXIgcGFyYW1ldGVycyBvbiB0aGUgd3JpdGUgRklGTyBjb21tYW5kKi8KICBmaWZvd29yZCA9IFBhcmFtMTsKICBuYkJ5dGVzID0gKE5iUGFyYW1zIDwgM1UpID8gTmJQYXJhbXMgOiAzVTsKCiAgZm9yIChjb3VudCA9IDBVOyBjb3VudCA8IG5iQnl0ZXM7IGNvdW50KyspCiAgewogICAgZmlmb3dvcmQgfD0gKCgodWludDMyX3QpKCoocHBhcmFtcyArIGNvdW50KSkpIDw8ICg4VSArICg4VSAqIGNvdW50KSkpOwogIH0KICBoZHNpLT5JbnN0YW5jZS0+R1BEUiA9IGZpZm93b3JkOwoKICB1aWNvdW50ZXIgPSBOYlBhcmFtcyAtIG5iQnl0ZXM7CiAgcHBhcmFtcyArPSBuYkJ5dGVzOwogIC8qIFNldCB0aGUgTmV4dCBwYXJhbWV0ZXJzIG9uIHRoZSB3cml0ZSBGSUZPIGNvbW1hbmQqLwogIHdoaWxlICh1aWNvdW50ZXIgIT0gMFUpCiAgewogICAgbmJCeXRlcyA9ICh1aWNvdW50ZXIgPCA0VSkgPyB1aWNvdW50ZXIgOiA0VTsKICAgIGZpZm93b3JkID0gMFU7CiAgICBmb3IgKGNvdW50ID0gMFU7IGNvdW50IDwgbmJCeXRlczsgY291bnQrKykKICAgIHsKICAgICAgZmlmb3dvcmQgfD0gKCgodWludDMyX3QpKCoocHBhcmFtcyArIGNvdW50KSkpIDw8ICg4VSAqIGNvdW50KSk7CiAgICB9CiAgICBoZHNpLT5JbnN0YW5jZS0+R1BEUiA9IGZpZm93b3JkOwoKICAgIHVpY291bnRlciAtPSBuYkJ5dGVzOwogICAgcHBhcmFtcyArPSBuYkJ5dGVzOwogIH0KCiAgLyogQ29uZmlndXJlIHRoZSBwYWNrZXQgdG8gc2VuZCBhIGxvbmcgRENTIGNvbW1hbmQgKi8KICBEU0lfQ29uZmlnUGFja2V0SGVhZGVyKGhkc2ktPkluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbElELAogICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICgoTmJQYXJhbXMgKyAxVSkgJiAweDAwRkZVKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgoKE5iUGFyYW1zICsgMVUpICYgMHhGRjAwVSkgPj4gOFUpKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlYWQgY29tbWFuZCAoRENTIG9yIGdlbmVyaWMpCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgQ2hhbm5lbE5iciAgVmlydHVhbCBjaGFubmVsIElECiAgKiBAcGFyYW0gIEFycmF5IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gc3RvcmUgdGhlIHBheWxvYWQgb2YgYSByZWFkIGJhY2sgb3BlcmF0aW9uLgogICogQHBhcmFtICBTaXplICBEYXRhIHNpemUgdG8gYmUgcmVhZCAoaW4gYnl0ZSkuCiAgKiBAcGFyYW0gIE1vZGUgIERTSSByZWFkIHBhY2tldCBkYXRhIHR5cGUuCiAgKiAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQGFyZyBEU0lfU0hPUlRfUkVBRF9QS1RfRGF0YV9UeXBlLgogICogQHBhcmFtICBEQ1NDbWQgIERDUyBnZXQvcmVhZCBjb21tYW5kLgogICogQHBhcmFtICBQYXJhbWV0ZXJzVGFibGUgIFBvaW50ZXIgdG8gcGFyYW1ldGVyIHZhbHVlcyB0YWJsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfUmVhZChEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYW5uZWxOYnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRENTQ21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqUGFyYW1ldGVyc1RhYmxlKQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIHVpbnQ4X3QgKnBkYXRhID0gQXJyYXk7CiAgdWludDMyX3QgZGF0YXNpemUgPSBTaXplOwogIHVpbnQzMl90IGZpZm93b3JkOwogIHVpbnQzMl90IG5iYnl0ZXM7CiAgdWludDMyX3QgY291bnQ7CgogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfRFNJX1JFQURfUEFDS0VUX1RZUEUoTW9kZSkpOwoKICBpZiAoZGF0YXNpemUgPiAyVSkKICB7CiAgICAvKiBzZXQgbWF4IHJldHVybiBwYWNrZXQgc2l6ZSAqLwogICAgaWYgKERTSV9TaG9ydFdyaXRlKGhkc2ksIENoYW5uZWxOYnIsIERTSV9NQVhfUkVUVVJOX1BLVF9TSVpFLCAoKGRhdGFzaXplKSAmIDB4RkZVKSwKICAgICAgICAgICAgICAgICAgICAgICAoKChkYXRhc2l6ZSkgPj4gOFUpICYgMHhGRlUpKSAhPSBIQUxfT0spCiAgICB7CiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICB9CgogIC8qIENvbmZpZ3VyZSB0aGUgcGFja2V0IHRvIHJlYWQgY29tbWFuZCAqLwogIGlmIChNb2RlID09IERTSV9EQ1NfU0hPUlRfUEtUX1JFQUQpCiAgewogICAgRFNJX0NvbmZpZ1BhY2tldEhlYWRlcihoZHNpLT5JbnN0YW5jZSwgQ2hhbm5lbE5iciwgTW9kZSwgRENTQ21kLCAwVSk7CiAgfQogIGVsc2UgaWYgKE1vZGUgPT0gRFNJX0dFTl9TSE9SVF9QS1RfUkVBRF9QMCkKICB7CiAgICBEU0lfQ29uZmlnUGFja2V0SGVhZGVyKGhkc2ktPkluc3RhbmNlLCBDaGFubmVsTmJyLCBNb2RlLCAwVSwgMFUpOwogIH0KICBlbHNlIGlmIChNb2RlID09IERTSV9HRU5fU0hPUlRfUEtUX1JFQURfUDEpCiAgewogICAgRFNJX0NvbmZpZ1BhY2tldEhlYWRlcihoZHNpLT5JbnN0YW5jZSwgQ2hhbm5lbE5iciwgTW9kZSwgUGFyYW1ldGVyc1RhYmxlWzBVXSwgMFUpOwogIH0KICBlbHNlIGlmIChNb2RlID09IERTSV9HRU5fU0hPUlRfUEtUX1JFQURfUDIpCiAgewogICAgRFNJX0NvbmZpZ1BhY2tldEhlYWRlcihoZHNpLT5JbnN0YW5jZSwgQ2hhbm5lbE5iciwgTW9kZSwgUGFyYW1ldGVyc1RhYmxlWzBVXSwgUGFyYW1ldGVyc1RhYmxlWzFVXSk7CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKCiAgLyogSWYgRFNJIGZpZm8gaXMgbm90IGVtcHR5LCByZWFkIHJlcXVlc3RlZCBieXRlcyAqLwogIHdoaWxlICgoKGludDMyX3QpKGRhdGFzaXplKSkgPiAwKQogIHsKICAgIGlmICgoaGRzaS0+SW5zdGFuY2UtPkdQU1IgJiBEU0lfR1BTUl9QUkRGRSkgPT0gMFUpCiAgICB7CiAgICAgIGZpZm93b3JkID0gaGRzaS0+SW5zdGFuY2UtPkdQRFI7CiAgICAgIG5iYnl0ZXMgPSAoZGF0YXNpemUgPCA0VSkgPyBkYXRhc2l6ZSA6IDRVOwoKICAgICAgZm9yIChjb3VudCA9IDBVOyBjb3VudCA8IG5iYnl0ZXM7IGNvdW50KyspCiAgICAgIHsKICAgICAgICAqcGRhdGEgPSAodWludDhfdCkoZmlmb3dvcmQgPj4gKDhVICogY291bnQpKTsKICAgICAgICBwZGF0YSsrOwogICAgICAgIGRhdGFzaXplLS07CiAgICAgIH0KICAgIH0KCiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBEU0lfVElNRU9VVF9WQUxVRSkKICAgIHsKICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICB9CgogICAgLyogU29mdHdhcmUgd29ya2Fyb3VuZCB0byBhdm9pZCBIQUxfVElNRU9VVCB3aGVuIGEgRFNJIHJlYWQgY29tbWFuZCBpcyAgICovCiAgICAvKiBpc3N1ZWQgdG8gdGhlIHBhbmVsIGFuZCB0aGUgcmVhZCBkYXRhIGlzIG5vdCBjYXB0dXJlZCBieSB0aGUgRFNJIEhvc3QgKi8KICAgIC8qIHdoaWNoIHJldHVybnMgUGFja2V0IFNpemUgRXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogTmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgUmVhZCBjb21tYW5kIGhhcyBmaW5pc2hlZCBiZWZvcmUgY2hlY2tpbmcgUFNFICovCiAgICBpZiAoKGhkc2ktPkluc3RhbmNlLT5HUFNSICYgRFNJX0dQU1JfUkNCKSA9PSAwVSkKICAgIHsKICAgICAgaWYgKChoZHNpLT5JbnN0YW5jZS0+SVNSWzFVXSAmIERTSV9JU1IxX1BTRSkgPT0gRFNJX0lTUjFfUFNFKQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEVudGVyIHRoZSBVTFBNIChVbHRyYSBMb3cgUG93ZXIgTW9kZSkgd2l0aCB0aGUgRC1QSFkgUExMIHJ1bm5pbmcKICAqICAgICAgICAgKG9ubHkgZGF0YSBsYW5lcyBhcmUgaW4gVUxQTSkKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9FbnRlclVMUE1EYXRhKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpKQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwoKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIFVMUFMgUmVxdWVzdCBvbiBEYXRhIExhbmVzICovCiAgaGRzaS0+SW5zdGFuY2UtPlBVQ1IgfD0gRFNJX1BVQ1JfVVJETDsKCiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAvKiBXYWl0IHVudGlsIHRoZSBELVBIWSBhY3RpdmUgbGFuZXMgZW50ZXIgaW50byBVTFBNICovCiAgaWYgKChoZHNpLT5JbnN0YW5jZS0+UENPTkZSICYgRFNJX1BDT05GUl9OTCkgPT0gRFNJX09ORV9EQVRBX0xBTkUpCiAgewogICAgd2hpbGUgKChoZHNpLT5JbnN0YW5jZS0+UFNSICYgRFNJX1BTUl9VQU4wKSAhPSAwVSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBEU0lfVElNRU9VVF9WQUxVRSkKICAgICAgewogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgfQogICAgfQogIH0KICBlbHNlIGlmICgoaGRzaS0+SW5zdGFuY2UtPlBDT05GUiAmIERTSV9QQ09ORlJfTkwpID09IERTSV9UV09fREFUQV9MQU5FUykKICB7CiAgICB3aGlsZSAoKGhkc2ktPkluc3RhbmNlLT5QU1IgJiAoRFNJX1BTUl9VQU4wIHwgRFNJX1BTUl9VQU4xKSkgIT0gMFUpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gRFNJX1RJTUVPVVRfVkFMVUUpCiAgICAgIHsKICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEV4aXQgdGhlIFVMUE0gKFVsdHJhIExvdyBQb3dlciBNb2RlKSB3aXRoIHRoZSBELVBIWSBQTEwgcnVubmluZwogICogICAgICAgICAob25seSBkYXRhIGxhbmVzIGFyZSBpbiBVTFBNKQogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX0V4aXRVTFBNRGF0YShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBFeGl0IFVMUFMgb24gRGF0YSBMYW5lcyAqLwogIGhkc2ktPkluc3RhbmNlLT5QVUNSIHw9IERTSV9QVUNSX1VFREw7CgogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKCiAgLyogV2FpdCB1bnRpbCBhbGwgYWN0aXZlIGxhbmVzIGV4aXQgVUxQTSAqLwogIGlmICgoaGRzaS0+SW5zdGFuY2UtPlBDT05GUiAmIERTSV9QQ09ORlJfTkwpID09IERTSV9PTkVfREFUQV9MQU5FKQogIHsKICAgIHdoaWxlICgoaGRzaS0+SW5zdGFuY2UtPlBTUiAmIERTSV9QU1JfVUFOMCkgIT0gRFNJX1BTUl9VQU4wKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IERTSV9USU1FT1VUX1ZBTFVFKQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgaWYgKChoZHNpLT5JbnN0YW5jZS0+UENPTkZSICYgRFNJX1BDT05GUl9OTCkgPT0gRFNJX1RXT19EQVRBX0xBTkVTKQogIHsKICAgIHdoaWxlICgoaGRzaS0+SW5zdGFuY2UtPlBTUiAmIChEU0lfUFNSX1VBTjAgfCBEU0lfUFNSX1VBTjEpKSAhPSAoRFNJX1BTUl9VQU4wIHwgRFNJX1BTUl9VQU4xKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBEU0lfVElNRU9VVF9WQUxVRSkKICAgICAgewogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgfQogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICAvKiB3YWl0IGZvciAxIG1zKi8KICBIQUxfRGVsYXkoMVUpOwoKICAvKiBEZS1hc3NlcnQgdGhlIFVMUE0gcmVxdWVzdHMgYW5kIHRoZSBVTFBNIGV4aXQgYml0cyAqLwogIGhkc2ktPkluc3RhbmNlLT5QVUNSID0gMFU7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBFbnRlciB0aGUgVUxQTSAoVWx0cmEgTG93IFBvd2VyIE1vZGUpIHdpdGggdGhlIEQtUEhZIFBMTCB0dXJuZWQgb2ZmCiAgKiAgICAgICAgIChib3RoIGRhdGEgYW5kIGNsb2NrIGxhbmVzIGFyZSBpbiBVTFBNKQogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX0VudGVyVUxQTShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDbG9jayBsYW5lIGNvbmZpZ3VyYXRpb246IG5vIG1vcmUgSFMgcmVxdWVzdCAqLwogIGhkc2ktPkluc3RhbmNlLT5DTENSICY9IH5EU0lfQ0xDUl9EUENDOwoKICAvKiBVc2Ugc3lzdGVtIFBMTCBhcyBieXRlIGxhbmUgY2xvY2sgc291cmNlIGJlZm9yZSBzdG9wcGluZyBEU0lQSFkgY2xvY2sgc291cmNlICovCiAgX19IQUxfUkNDX0RTSV9DT05GSUcoUkNDX0RTSUNMS1NPVVJDRV9QTExTQUkyKTsKCiAgLyogVUxQUyBSZXF1ZXN0IG9uIENsb2NrIGFuZCBEYXRhIExhbmVzICovCiAgaGRzaS0+SW5zdGFuY2UtPlBVQ1IgfD0gKERTSV9QVUNSX1VSQ0wgfCBEU0lfUFVDUl9VUkRMKTsKCiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwoKICAvKiBXYWl0IHVudGlsIGFsbCBhY3RpdmUgbGFuZXMgZXhpdCBVTFBNICovCiAgaWYgKChoZHNpLT5JbnN0YW5jZS0+UENPTkZSICYgRFNJX1BDT05GUl9OTCkgPT0gRFNJX09ORV9EQVRBX0xBTkUpCiAgewogICAgd2hpbGUgKChoZHNpLT5JbnN0YW5jZS0+UFNSICYgKERTSV9QU1JfVUFOMCB8IERTSV9QU1JfVUFOQykpICE9IDBVKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IERTSV9USU1FT1VUX1ZBTFVFKQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgaWYgKChoZHNpLT5JbnN0YW5jZS0+UENPTkZSICYgRFNJX1BDT05GUl9OTCkgPT0gRFNJX1RXT19EQVRBX0xBTkVTKQogIHsKICAgIHdoaWxlICgoaGRzaS0+SW5zdGFuY2UtPlBTUiAmIChEU0lfUFNSX1VBTjAgfCBEU0lfUFNSX1VBTjEgfCBEU0lfUFNSX1VBTkMpKSAhPSAwVSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBEU0lfVElNRU9VVF9WQUxVRSkKICAgICAgewogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgfQogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICAvKiBUdXJuIG9mZiB0aGUgRFNJIFBMTCAqLwogIF9fSEFMX0RTSV9QTExfRElTQUJMRShoZHNpKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEV4aXQgdGhlIFVMUE0gKFVsdHJhIExvdyBQb3dlciBNb2RlKSB3aXRoIHRoZSBELVBIWSBQTEwgdHVybmVkIG9mZgogICogICAgICAgICAoYm90aCBkYXRhIGFuZCBjbG9jayBsYW5lcyBhcmUgaW4gVUxQTSkKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9FeGl0VUxQTShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBUdXJuIG9uIHRoZSBEU0kgUExMICovCiAgX19IQUxfRFNJX1BMTF9FTkFCTEUoaGRzaSk7CgogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKCiAgLyogV2FpdCBmb3IgdGhlIGxvY2sgb2YgdGhlIFBMTCAqLwogIHdoaWxlIChfX0hBTF9EU0lfR0VUX0ZMQUcoaGRzaSwgRFNJX0ZMQUdfUExMTFMpID09IDBVKQogIHsKICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IERTSV9USU1FT1VUX1ZBTFVFKQogICAgewogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgIH0KICB9CgogIC8qIFJlc2V0IHRoZSBkaWdpdGFsIHNlY3Rpb24gb2YgdGhlIEQtUEhZICovCiAgQ0xFQVJfQklUKGhkc2ktPkluc3RhbmNlLT5QQ1RMUiwgRFNJX1BDVExSX0RFTik7CiAgU0VUX0JJVChoZHNpLT5JbnN0YW5jZS0+UENUTFIsIERTSV9QQ1RMUl9ERU4pOwoKICAvKiBFeGl0IFVMUFMgb24gQ2xvY2sgYW5kIERhdGEgTGFuZXMgKi8KICBoZHNpLT5JbnN0YW5jZS0+UFVDUiB8PSAoRFNJX1BVQ1JfVUVDTCB8IERTSV9QVUNSX1VFREwpOwoKICAvKiBHZXQgdGljayAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogIC8qIFdhaXQgdW50aWwgYWxsIGFjdGl2ZSBsYW5lcyBleGl0IFVMUE0gKi8KICBpZiAoKGhkc2ktPkluc3RhbmNlLT5QQ09ORlIgJiBEU0lfUENPTkZSX05MKSA9PSBEU0lfT05FX0RBVEFfTEFORSkKICB7CiAgICB3aGlsZSAoKGhkc2ktPkluc3RhbmNlLT5QU1IgJiAoRFNJX1BTUl9VQU4wIHwgRFNJX1BTUl9VQU5DKSkgIT0gKERTSV9QU1JfVUFOMCB8IERTSV9QU1JfVUFOQykpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gRFNJX1RJTUVPVVRfVkFMVUUpCiAgICAgIHsKICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSBpZiAoKGhkc2ktPkluc3RhbmNlLT5QQ09ORlIgJiBEU0lfUENPTkZSX05MKSA9PSBEU0lfVFdPX0RBVEFfTEFORVMpCiAgewogICAgd2hpbGUgKChoZHNpLT5JbnN0YW5jZS0+UFNSICYgKERTSV9QU1JfVUFOMCB8IERTSV9QU1JfVUFOMSB8IERTSV9QU1JfVUFOQykpICE9IChEU0lfUFNSX1VBTjAgfCBEU0lfUFNSX1VBTjEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0lfUFNSX1VBTkMpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IERTSV9USU1FT1VUX1ZBTFVFKQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIHdhaXQgZm9yIDEgbXMgKi8KICBIQUxfRGVsYXkoMVUpOwoKICAvKiBEZS1hc3NlcnQgdGhlIFVMUE0gcmVxdWVzdHMgYW5kIHRoZSBVTFBNIGV4aXQgYml0cyAqLwogIGhkc2ktPkluc3RhbmNlLT5QVUNSID0gMFU7CgogIC8qIFN3aXRjaCB0aGUgbGFuZSBieXRlIGNsb2NrIHNvdXJjZSBpbiB0aGUgUkNDIGZyb20gc3lzdGVtIFBMTCB0byBELVBIWSAqLwogIF9fSEFMX1JDQ19EU0lfQ09ORklHKFJDQ19EU0lDTEtTT1VSQ0VfRFNJUEhZKTsKCiAgLyogUmVzdG9yZSBjbG9jayBsYW5lIGNvbmZpZ3VyYXRpb24gdG8gSFMgKi8KICBoZHNpLT5JbnN0YW5jZS0+Q0xDUiB8PSBEU0lfQ0xDUl9EUENDOwoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU3RhcnQgdGVzdCBwYXR0ZXJuIGdlbmVyYXRpb24KICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBNb2RlICBQYXR0ZXJuIGdlbmVyYXRvciBtb2RlCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgIDAgOiBDb2xvciBiYXJzIChob3Jpem9udGFsIG9yIHZlcnRpY2FsKQogICogICAgICAgICAgIDEgOiBCRVIgcGF0dGVybiAodmVydGljYWwgb25seSkKICAqIEBwYXJhbSAgT3JpZW50YXRpb24gIFBhdHRlcm4gZ2VuZXJhdG9yIG9yaWVudGF0aW9uCiAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgIDAgOiBWZXJ0aWNhbCBjb2xvciBiYXJzCiAgKiAgICAgICAgICAgMSA6IEhvcml6b250YWwgY29sb3IgYmFycwogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9QYXR0ZXJuR2VuZXJhdG9yU3RhcnQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IE1vZGUsIHVpbnQzMl90IE9yaWVudGF0aW9uKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDb25maWd1cmUgcGF0dGVybiBnZW5lcmF0b3IgbW9kZSBhbmQgb3JpZW50YXRpb24gKi8KICBoZHNpLT5JbnN0YW5jZS0+Vk1DUiAmPSB+KERTSV9WTUNSX1BHTSB8IERTSV9WTUNSX1BHTyk7CiAgaGRzaS0+SW5zdGFuY2UtPlZNQ1IgfD0gKChNb2RlIDw8IDIwVSkgfCAoT3JpZW50YXRpb24gPDwgMjRVKSk7CgogIC8qIEVuYWJsZSBwYXR0ZXJuIGdlbmVyYXRvciBieSBzZXR0aW5nIFBHRSBiaXQgKi8KICBoZHNpLT5JbnN0YW5jZS0+Vk1DUiB8PSBEU0lfVk1DUl9QR0U7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBTdG9wIHRlc3QgcGF0dGVybiBnZW5lcmF0aW9uCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfUGF0dGVybkdlbmVyYXRvclN0b3AoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIERpc2FibGUgcGF0dGVybiBnZW5lcmF0b3IgYnkgY2xlYXJpbmcgUEdFIGJpdCAqLwogIGhkc2ktPkluc3RhbmNlLT5WTUNSICY9IH5EU0lfVk1DUl9QR0U7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBTZXQgU2xldy1SYXRlIEFuZCBEZWxheSBUdW5pbmcKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBDb21tRGVsYXkgIENvbW11bmljYXRpb24gZGVsYXkgdG8gYmUgYWRqdXN0ZWQuCiAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9Db21tdW5pY2F0aW9uX0RlbGF5CiAgKiBAcGFyYW0gIExhbmUgIHNlbGVjdCBiZXR3ZWVuIGNsb2NrIG9yIGRhdGEgbGFuZXMuCiAgKiAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgb2YgQGFyZyBEU0lfTGFuZV9Hcm91cAogICogQHBhcmFtICBWYWx1ZSAgQ3VzdG9tIHZhbHVlIG9mIHRoZSBzbGV3LXJhdGUgb3IgZGVsYXkKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfU2V0U2xld1JhdGVBbmREZWxheVR1bmluZyhEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgdWludDMyX3QgQ29tbURlbGF5LCB1aW50MzJfdCBMYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVmFsdWUpCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfRFNJX0NPTU1VTklDQVRJT05fREVMQVkoQ29tbURlbGF5KSk7CiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9MQU5FX0dST1VQKExhbmUpKTsKCiAgc3dpdGNoIChDb21tRGVsYXkpCiAgewogICAgY2FzZSBEU0lfU0xFV19SQVRFX0hTVFg6CiAgICAgIGlmIChMYW5lID09IERTSV9DTE9DS19MQU5FKQogICAgICB7CiAgICAgICAgLyogSGlnaC1TcGVlZCBUcmFuc21pc3Npb24gU2xldyBSYXRlIENvbnRyb2wgb24gQ2xvY2sgTGFuZSAqLwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSAmPSB+RFNJX1dQQ1IxX0hTVFhTUkNDTDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsxVV0gfD0gVmFsdWUgPDwgMTZVOwogICAgICB9CiAgICAgIGVsc2UgaWYgKExhbmUgPT0gRFNJX0RBVEFfTEFORVMpCiAgICAgIHsKICAgICAgICAvKiBIaWdoLVNwZWVkIFRyYW5zbWlzc2lvbiBTbGV3IFJhdGUgQ29udHJvbCBvbiBEYXRhIExhbmVzICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdICY9IH5EU0lfV1BDUjFfSFNUWFNSQ0RMOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSB8PSBWYWx1ZSA8PCAxOFU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgRFNJX1NMRVdfUkFURV9MUFRYOgogICAgICBpZiAoTGFuZSA9PSBEU0lfQ0xPQ0tfTEFORSkKICAgICAgewogICAgICAgIC8qIExvdy1Qb3dlciB0cmFuc21pc3Npb24gU2xldyBSYXRlIENvbXBlbnNhdGlvbiBvbiBDbG9jayBMYW5lICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdICY9IH5EU0lfV1BDUjFfTFBTUkNDTDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsxVV0gfD0gVmFsdWUgPDwgNlU7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoTGFuZSA9PSBEU0lfREFUQV9MQU5FUykKICAgICAgewogICAgICAgIC8qIExvdy1Qb3dlciB0cmFuc21pc3Npb24gU2xldyBSYXRlIENvbXBlbnNhdGlvbiBvbiBEYXRhIExhbmVzICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdICY9IH5EU0lfV1BDUjFfTFBTUkNETDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsxVV0gfD0gVmFsdWUgPDwgOFU7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgRFNJX0hTX0RFTEFZOgogICAgICBpZiAoTGFuZSA9PSBEU0lfQ0xPQ0tfTEFORSkKICAgICAgewogICAgICAgIC8qIEhpZ2gtU3BlZWQgVHJhbnNtaXNzaW9uIERlbGF5IG9uIENsb2NrIExhbmUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsxVV0gJj0gfkRTSV9XUENSMV9IU1RYRENMOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSB8PSBWYWx1ZTsKICAgICAgfQogICAgICBlbHNlIGlmIChMYW5lID09IERTSV9EQVRBX0xBTkVTKQogICAgICB7CiAgICAgICAgLyogSGlnaC1TcGVlZCBUcmFuc21pc3Npb24gRGVsYXkgb24gRGF0YSBMYW5lcyAqLwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSAmPSB+RFNJX1dQQ1IxX0hTVFhEREw7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdIHw9IFZhbHVlIDw8IDJVOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICB9CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBMb3ctUG93ZXIgUmVjZXB0aW9uIEZpbHRlciBUdW5pbmcKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBGcmVxdWVuY3kgIGN1dG9mZiBmcmVxdWVuY3kgb2YgbG93LXBhc3MgZmlsdGVyIGF0IHRoZSBpbnB1dCBvZiBMUFJYCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX1NldExvd1Bvd2VyUlhGaWx0ZXIoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IEZyZXF1ZW5jeSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogTG93LVBvd2VyIFJYIGxvdy1wYXNzIEZpbHRlcmluZyBUdW5pbmcgKi8KICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsxVV0gJj0gfkRTSV9XUENSMV9MUFJYRlQ7CiAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdIHw9IEZyZXF1ZW5jeSA8PCAyNVU7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBBY3RpdmF0ZSBhbiBhZGRpdGlvbmFsIGN1cnJlbnQgcGF0aCBvbiBhbGwgbGFuZXMgdG8gbWVldCB0aGUgU0REVHggcGFyYW1ldGVyCiAgKiAgICAgICAgIGRlZmluZWQgaW4gdGhlIE1JUEkgRC1QSFkgc3BlY2lmaWNhdGlvbgogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIFN0YXRlICBFTkFCTEUgb3IgRElTQUJMRQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9TZXRTREQoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIEZ1bmN0aW9uYWxTdGF0ZSBTdGF0ZSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKFN0YXRlKSk7CgogIC8qIEFjdGl2YXRlL0Rpc2FjdGl2YXRlIGFkZGl0aW9uYWwgY3VycmVudCBwYXRoIG9uIGFsbCBsYW5lcyAqLwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSAmPSB+RFNJX1dQQ1IxX1NEREM7CiAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMVVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgMTJVKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEN1c3RvbSBsYW5lIHBpbnMgY29uZmlndXJhdGlvbgogICogQHBhcmFtICBoZHNpICBwb2ludGVyIHRvIGEgRFNJX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBEU0kuCiAgKiBAcGFyYW0gIEN1c3RvbUxhbmUgIEZ1bmN0aW9uIHRvIGJlIGFwcGxpZWQgb24gc2VsZWN0ZWQgbGFuZS4KICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9DdXN0b21MYW5lCiAgKiBAcGFyYW0gIExhbmUgIHNlbGVjdCBiZXR3ZWVuIGNsb2NrIG9yIGRhdGEgbGFuZSAwIG9yIGRhdGEgbGFuZSAxLgogICogICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEBhcmcgRFNJX0xhbmVfU2VsZWN0CiAgKiBAcGFyYW0gIFN0YXRlICBFTkFCTEUgb3IgRElTQUJMRQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9TZXRMYW5lUGluc0NvbmZpZ3VyYXRpb24oRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IEN1c3RvbUxhbmUsIHVpbnQzMl90IExhbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxTdGF0ZSBTdGF0ZSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19EU0lfQ1VTVE9NX0xBTkUoQ3VzdG9tTGFuZSkpOwogIGFzc2VydF9wYXJhbShJU19EU0lfTEFORShMYW5lKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoU3RhdGUpKTsKCiAgc3dpdGNoIChDdXN0b21MYW5lKQogIHsKICAgIGNhc2UgRFNJX1NXQVBfTEFORV9QSU5TOgogICAgICBpZiAoTGFuZSA9PSBEU0lfQ0xLX0xBTkUpCiAgICAgIHsKICAgICAgICAvKiBTd2FwIHBpbnMgb24gY2xvY2sgbGFuZSAqLwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1NXQ0w7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgNlUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKExhbmUgPT0gRFNJX0RBVEFfTEFORTApCiAgICAgIHsKICAgICAgICAvKiBTd2FwIHBpbnMgb24gZGF0YSBsYW5lIDAgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9TV0RMMDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCA3VSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoTGFuZSA9PSBEU0lfREFUQV9MQU5FMSkKICAgICAgewogICAgICAgIC8qIFN3YXAgcGlucyBvbiBkYXRhIGxhbmUgMSAqLwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1NXREwxOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDhVKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBEU0lfSU5WRVJUX0hTX1NJR05BTDoKICAgICAgaWYgKExhbmUgPT0gRFNJX0NMS19MQU5FKQogICAgICB7CiAgICAgICAgLyogSW52ZXJ0IEhTIHNpZ25hbCBvbiBjbG9jayBsYW5lICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdICY9IH5EU0lfV1BDUjBfSFNJQ0w7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgOVUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKExhbmUgPT0gRFNJX0RBVEFfTEFORTApCiAgICAgIHsKICAgICAgICAvKiBJbnZlcnQgSFMgc2lnbmFsIG9uIGRhdGEgbGFuZSAwICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdICY9IH5EU0lfV1BDUjBfSFNJREwwOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDEwVSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoTGFuZSA9PSBEU0lfREFUQV9MQU5FMSkKICAgICAgewogICAgICAgIC8qIEludmVydCBIUyBzaWduYWwgb24gZGF0YSBsYW5lIDEgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9IU0lETDE7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgMTFVKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgfQoKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhkc2kpOwoKICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU2V0IGN1c3RvbSB0aW1pbmcgZm9yIHRoZSBQSFkKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBUaW1pbmcgIFBIWSB0aW1pbmcgdG8gYmUgYWRqdXN0ZWQuCiAgKiAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9QSFlfVGltaW5nCiAgKiBAcGFyYW0gIFN0YXRlICBFTkFCTEUgb3IgRElTQUJMRQogICogQHBhcmFtICBWYWx1ZSAgQ3VzdG9tIHZhbHVlIG9mIHRoZSB0aW1pbmcKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfU2V0UEhZVGltaW5ncyhEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgdWludDMyX3QgVGltaW5nLCBGdW5jdGlvbmFsU3RhdGUgU3RhdGUsIHVpbnQzMl90IFZhbHVlKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0RTSV9QSFlfVElNSU5HKFRpbWluZykpOwogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKFN0YXRlKSk7CgogIHN3aXRjaCAoVGltaW5nKQogIHsKICAgIGNhc2UgRFNJX1RDTEtfUE9TVDoKICAgICAgLyogRW5hYmxlL0Rpc2FibGUgY3VzdG9tIHRpbWluZyBzZXR0aW5nICovCiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1RDTEtQT1NURU47CiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDI3VSk7CgogICAgICBpZiAoU3RhdGUgIT0gRElTQUJMRSkKICAgICAgewogICAgICAgIC8qIFNldCBjdXN0b20gdmFsdWUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUls0VV0gJj0gfkRTSV9XUENSNF9UQ0xLUE9TVDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUls0VV0gfD0gVmFsdWUgJiBEU0lfV1BDUjRfVENMS1BPU1Q7CiAgICAgIH0KCiAgICAgIGJyZWFrOwogICAgY2FzZSBEU0lfVExQWF9DTEs6CiAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIGN1c3RvbSB0aW1pbmcgc2V0dGluZyAqLwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9UTFBYQ0VOOwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCAyNlUpOwoKICAgICAgaWYgKFN0YXRlICE9IERJU0FCTEUpCiAgICAgIHsKICAgICAgICAvKiBTZXQgY3VzdG9tIHZhbHVlICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbM1VdICY9IH5EU0lfV1BDUjNfVExQWEM7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbM1VdIHw9IChWYWx1ZSA8PCAyNFUpICYgRFNJX1dQQ1IzX1RMUFhDOwogICAgICB9CgogICAgICBicmVhazsKICAgIGNhc2UgRFNJX1RIU19FWElUOgogICAgICAvKiBFbmFibGUvRGlzYWJsZSBjdXN0b20gdGltaW5nIHNldHRpbmcgKi8KICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdICY9IH5EU0lfV1BDUjBfVEhTRVhJVEVOOwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCAyNVUpOwoKICAgICAgaWYgKFN0YXRlICE9IERJU0FCTEUpCiAgICAgIHsKICAgICAgICAvKiBTZXQgY3VzdG9tIHZhbHVlICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbM1VdICY9IH5EU0lfV1BDUjNfVEhTRVhJVDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlszVV0gfD0gKFZhbHVlIDw8IDE2VSkgJiBEU0lfV1BDUjNfVEhTRVhJVDsKICAgICAgfQoKICAgICAgYnJlYWs7CiAgICBjYXNlIERTSV9UTFBYX0RBVEE6CiAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIGN1c3RvbSB0aW1pbmcgc2V0dGluZyAqLwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9UTFBYREVOOwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCAyNFUpOwoKICAgICAgaWYgKFN0YXRlICE9IERJU0FCTEUpCiAgICAgIHsKICAgICAgICAvKiBTZXQgY3VzdG9tIHZhbHVlICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbM1VdICY9IH5EU0lfV1BDUjNfVExQWEQ7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbM1VdIHw9IChWYWx1ZSA8PCA4VSkgJiBEU0lfV1BDUjNfVExQWEQ7CiAgICAgIH0KCiAgICAgIGJyZWFrOwogICAgY2FzZSBEU0lfVEhTX1pFUk86CiAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIGN1c3RvbSB0aW1pbmcgc2V0dGluZyAqLwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9USFNaRVJPRU47CiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDIzVSk7CgogICAgICBpZiAoU3RhdGUgIT0gRElTQUJMRSkKICAgICAgewogICAgICAgIC8qIFNldCBjdXN0b20gdmFsdWUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlszVV0gJj0gfkRTSV9XUENSM19USFNaRVJPOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzNVXSB8PSBWYWx1ZSAmIERTSV9XUENSM19USFNaRVJPOwogICAgICB9CgogICAgICBicmVhazsKICAgIGNhc2UgRFNJX1RIU19UUkFJTDoKICAgICAgLyogRW5hYmxlL0Rpc2FibGUgY3VzdG9tIHRpbWluZyBzZXR0aW5nICovCiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1RIU1RSQUlMRU47CiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDIyVSk7CgogICAgICBpZiAoU3RhdGUgIT0gRElTQUJMRSkKICAgICAgewogICAgICAgIC8qIFNldCBjdXN0b20gdmFsdWUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsyVV0gJj0gfkRTSV9XUENSMl9USFNUUkFJTDsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsyVV0gfD0gKFZhbHVlIDw8IDI0VSkgJiBEU0lfV1BDUjJfVEhTVFJBSUw7CiAgICAgIH0KCiAgICAgIGJyZWFrOwogICAgY2FzZSBEU0lfVEhTX1BSRVBBUkU6CiAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIGN1c3RvbSB0aW1pbmcgc2V0dGluZyAqLwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9USFNQUkVQRU47CiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDIxVSk7CgogICAgICBpZiAoU3RhdGUgIT0gRElTQUJMRSkKICAgICAgewogICAgICAgIC8qIFNldCBjdXN0b20gdmFsdWUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsyVV0gJj0gfkRTSV9XUENSMl9USFNQUkVQOwogICAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzJVXSB8PSAoVmFsdWUgPDwgMTZVKSAmIERTSV9XUENSMl9USFNQUkVQOwogICAgICB9CgogICAgICBicmVhazsKICAgIGNhc2UgRFNJX1RDTEtfWkVSTzoKICAgICAgLyogRW5hYmxlL0Rpc2FibGUgY3VzdG9tIHRpbWluZyBzZXR0aW5nICovCiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1RDTEtaRVJPRU47CiAgICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDIwVSk7CgogICAgICBpZiAoU3RhdGUgIT0gRElTQUJMRSkKICAgICAgewogICAgICAgIC8qIFNldCBjdXN0b20gdmFsdWUgKi8KICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsyVV0gJj0gfkRTSV9XUENSMl9UQ0xLWkVSTzsKICAgICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlsyVV0gfD0gKFZhbHVlIDw8IDhVKSAmIERTSV9XUENSMl9UQ0xLWkVSTzsKICAgICAgfQoKICAgICAgYnJlYWs7CiAgICBjYXNlIERTSV9UQ0xLX1BSRVBBUkU6CiAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIGN1c3RvbSB0aW1pbmcgc2V0dGluZyAqLwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9UQ0xLUFJFUEVOOwogICAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCAxOVUpOwoKICAgICAgaWYgKFN0YXRlICE9IERJU0FCTEUpCiAgICAgIHsKICAgICAgICAvKiBTZXQgY3VzdG9tIHZhbHVlICovCiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMlVdICY9IH5EU0lfV1BDUjJfVENMS1BSRVA7CiAgICAgICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMlVdIHw9IFZhbHVlICYgRFNJX1dQQ1IyX1RDTEtQUkVQOwogICAgICB9CgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogIH0KCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEZvcmNlIHRoZSBDbG9jay9EYXRhIExhbmUgaW4gVFggU3RvcCBNb2RlCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgTGFuZSAgc2VsZWN0IGJldHdlZW4gY2xvY2sgb3IgZGF0YSBsYW5lcy4KICAqICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAYXJnIERTSV9MYW5lX0dyb3VwCiAgKiBAcGFyYW0gIFN0YXRlICBFTkFCTEUgb3IgRElTQUJMRQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RTSV9Gb3JjZVRYU3RvcE1vZGUoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIHVpbnQzMl90IExhbmUsIEZ1bmN0aW9uYWxTdGF0ZSBTdGF0ZSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19EU0lfTEFORV9HUk9VUChMYW5lKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoU3RhdGUpKTsKCiAgaWYgKExhbmUgPT0gRFNJX0NMT0NLX0xBTkUpCiAgewogICAgLyogRm9yY2UvVW5mb3JjZSB0aGUgQ2xvY2sgTGFuZSBpbiBUWCBTdG9wIE1vZGUgKi8KICAgIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX0ZUWFNNQ0w7CiAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gfD0gKCh1aW50MzJfdClTdGF0ZSA8PCAxMlUpOwogIH0KICBlbHNlIGlmIChMYW5lID09IERTSV9EQVRBX0xBTkVTKQogIHsKICAgIC8qIEZvcmNlL1VuZm9yY2UgdGhlIERhdGEgTGFuZXMgaW4gVFggU3RvcCBNb2RlICovCiAgICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9GVFhTTURMOwogICAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgMTNVKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEZvcmNlIExQIFJlY2VpdmVyIGluIExvdy1Qb3dlciBNb2RlCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEBwYXJhbSAgU3RhdGUgIEVOQUJMRSBvciBESVNBQkxFCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRFNJX0ZvcmNlUlhMb3dQb3dlcihEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgRnVuY3Rpb25hbFN0YXRlIFN0YXRlKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoU3RhdGUpKTsKCiAgLyogRm9yY2UvVW5mb3JjZSBMUCBSZWNlaXZlciBpbiBMb3ctUG93ZXIgTW9kZSAqLwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSAmPSB+RFNJX1dQQ1IxX0ZMUFJYTFBNOwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzFVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDIyVSk7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBGb3JjZSBEYXRhIExhbmVzIGluIFJYIE1vZGUgYWZ0ZXIgYSBCVEEKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBTdGF0ZSAgRU5BQkxFIG9yIERJU0FCTEUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfRm9yY2VEYXRhTGFuZXNJblJYKERTSV9IYW5kbGVUeXBlRGVmICpoZHNpLCBGdW5jdGlvbmFsU3RhdGUgU3RhdGUpCnsKICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogIF9fSEFMX0xPQ0soaGRzaSk7CgogIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShTdGF0ZSkpOwoKICAvKiBGb3JjZSBEYXRhIExhbmVzIGluIFJYIE1vZGUgKi8KICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9URERMOwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDE2VSk7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBFbmFibGUgYSBwdWxsLWRvd24gb24gdGhlIGxhbmVzIHRvIHByZXZlbnQgZnJvbSBmbG9hdGluZyBzdGF0ZXMgd2hlbiB1bnVzZWQKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBTdGF0ZSAgRU5BQkxFIG9yIERJU0FCTEUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfU2V0UHVsbERvd24oRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2ksIEZ1bmN0aW9uYWxTdGF0ZSBTdGF0ZSkKewogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoZHNpKTsKCiAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKFN0YXRlKSk7CgogIC8qIEVuYWJsZS9EaXNhYmxlIHB1bGwtZG93biBvbiBsYW5lcyAqLwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSAmPSB+RFNJX1dQQ1IwX1BERU47CiAgaGRzaS0+SW5zdGFuY2UtPldQQ1JbMFVdIHw9ICgodWludDMyX3QpU3RhdGUgPDwgMThVKTsKCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogIF9fSEFMX1VOTE9DSyhoZHNpKTsKCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIFN3aXRjaCBvZmYgdGhlIGNvbnRlbnRpb24gZGV0ZWN0aW9uIG9uIGRhdGEgbGFuZXMKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHBhcmFtICBTdGF0ZSAgRU5BQkxFIG9yIERJU0FCTEUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EU0lfU2V0Q29udGVudGlvbkRldGVjdGlvbk9mZihEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSwgRnVuY3Rpb25hbFN0YXRlIFN0YXRlKQp7CiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhkc2kpOwoKICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoU3RhdGUpKTsKCiAgLyogQ29udGVudGlvbiBEZXRlY3Rpb24gb24gRGF0YSBMYW5lcyBPRkYgKi8KICBoZHNpLT5JbnN0YW5jZS0+V1BDUlswVV0gJj0gfkRTSV9XUENSMF9DRE9GRkRMOwogIGhkc2ktPkluc3RhbmNlLT5XUENSWzBVXSB8PSAoKHVpbnQzMl90KVN0YXRlIDw8IDE0VSk7CgogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGRzaSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqIEBkZWZncm91cCBEU0lfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3JzIGZ1bmN0aW9ucwogICoKQHZlcmJhdGltCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9ycyBmdW5jdGlvbnMgIyMjIyMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8KICAgICAgKCspIENoZWNrIHRoZSBEU0kgc3RhdGUuCiAgICAgICgrKSBHZXQgZXJyb3IgY29kZS4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIFJldHVybiB0aGUgRFNJIHN0YXRlCiAgKiBAcGFyYW0gIGhkc2kgIHBvaW50ZXIgdG8gYSBEU0lfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERTSS4KICAqIEByZXR2YWwgSEFMIHN0YXRlCiAgKi8KSEFMX0RTSV9TdGF0ZVR5cGVEZWYgSEFMX0RTSV9HZXRTdGF0ZShEU0lfSGFuZGxlVHlwZURlZiAqaGRzaSkKewogIHJldHVybiBoZHNpLT5TdGF0ZTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJldHVybiB0aGUgRFNJIGVycm9yIGNvZGUKICAqIEBwYXJhbSAgaGRzaSAgcG9pbnRlciB0byBhIERTSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRFNJLgogICogQHJldHZhbCBEU0kgRXJyb3IgQ29kZQogICovCnVpbnQzMl90IEhBTF9EU0lfR2V0RXJyb3IoRFNJX0hhbmRsZVR5cGVEZWYgKmhkc2kpCnsKICAvKiBHZXQgdGhlIGVycm9yIGNvZGUgKi8KICByZXR1cm4gaGRzaS0+RXJyb3JDb2RlOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgojZW5kaWYgLyogRFNJICovCgojZW5kaWYgLyogSEFMX0RTSV9NT0RVTEVfRU5BQkxFRCAqLwoKLyoqCiAgKiBAfQogICovCg==