LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX2NyeXBfZXguYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEV4dGVuZGVkIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIKICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBDUllQIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgogICogICAgICAgICAgICsgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCiAgKgogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICBUaGUgQ1JZUCBleHRlbnNpb24gSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgKCMpQWZ0ZXIgQUVTLUdDTSBvciBBRVMtQ0NNICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdXNlciBjYW4gc3RhcnQgZm9sbG93aW5nIEFQSQogICAgICAgdG8gZ2V0IHRoZSAgYXV0aGVudGljYXRpb24gbWVzc2FnZXMgOgogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCiNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQojaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKXx8IGRlZmluZWQgKEFFUykKLyoqIEBkZWZncm91cCBDUllQRXggQ1JZUEV4CiAgKiBAYnJpZWYgQ1JZUCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRGVmaW5lcwogICogQHsKICAqLwojaWYgZGVmaW5lZChBRVMpCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgICAgICAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLwoKI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEVuY3J5cHRpb24gbW9kZSAgICovCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgICAgICAgICAgICAgIEFFU19DUl9NT0RFXzEgICAgICAgICAgIC8qITwgRGVjcnlwdGlvbiAgICAgICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQgICAgIEFFU19DUl9NT0RFICAgICAgICAgICAgIC8qITwgS2V5IGRlcml2YXRpb24gYW5kIGRlY3J5cHRpb24gb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAgKi8KCiNlbHNlIC8qIENSWVAgKi8KCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMAojZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMQojZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEgKCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgQ1JZUF9DUl9BTEdPRElSCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiNkZWZpbmUgIENSWVBFeF9QSEFTRV9QUk9DRVNTICAgICAgIDB4MDJVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCiNkZWZpbmUgIENSWVBFeF9QSEFTRV9GSU5BTCAgICAgICAgIDB4MDNVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBmaW5hbCBwaGFzZSB0aGlzIGlzIHJlbGV2YW50IG9ubHkgd2l0aCBDQ00gYW5kIEdDTSBtb2RlcyAqLwoKLyogIENUUjAgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KI2RlZmluZSBDUllQX0NDTV9DVFIwXzAgICAgICAgICAgICAweDA3RkZGRkZGVQojZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVCgoKLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgovKiBFeHBvcnRlZCBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucwogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKICAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KICAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBnZW5lcmF0ZSB0aGUgYXV0aGVudGljYXRpb24KICAgICAgICAgIFRBRyBpbiBQb2xsaW5nIG1vZGUKICAgICAgKCMpSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICgjKUhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCgovKioKICAqIEBicmllZiAgZ2VuZXJhdGUgdGhlIEdDTSBhdXRoZW50aWNhdGlvbiBUQUcuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBBdXRoVGFnOiBQb2ludGVyIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBidWZmZXIKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIHVpbnQ2NF90IGhlYWRlcmxlbmd0aCA9ICh1aW50NjRfdCkoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgKiAzMlU7IC8qIEhlYWRlciBsZW5ndGggaW4gYml0cyAqLwogIHVpbnQ2NF90IGlucHV0bGVuZ3RoID0gKHVpbnQ2NF90KWhjcnlwLT5TaXplc1N1bSAqIDhVOyAvKiBpbnB1dCBsZW5ndGggaW4gYml0cyAqLwogIHVpbnQzMl90IHRhZ2FkZHIgPSAodWludDMyX3QpQXV0aFRhZzsKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CgogICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCiAgICB7CiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwaGFzZSAqLwogICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CiAgICB9CiAgICBlbHNlIC8qIEluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQqLwogICAgewogICAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBTZXF1ZW5jZSBlcnJvciBjb2RlIGZpZWxkICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7CgogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiNpZiBkZWZpbmVkKENSWVApCgogICAgLyogRGlzYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgIC8qQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkNSICY9ICB+Q1JZUF9DUl9BTEdPRElSOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLyogV3JpdGUgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzCiAgICBpbiB0aGUgcGF5bG9hZCAqLwogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigodWludDMyX3QpaGVhZGVybGVuZ3RoLCAxNlUpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdClpbnB1dGxlbmd0aCwgMTZVKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAodWludDMyX3QpKGlucHV0bGVuZ3RoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgfQoKICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CgojZWxzZSAvKiBBRVMqLwoKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgIC8qIFdyaXRlIHRoZSBudW1iZXIgb2YgYml0cyBpbiBoZWFkZXIgKDY0IGJpdHMpIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgYml0cwogICAgaW4gdGhlIHBheWxvYWQgKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCh1aW50MzJfdCloZWFkZXJsZW5ndGgsIDE2VSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigodWludDMyX3QpaW5wdXRsZW5ndGgsIDE2VSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzMyQikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICh1aW50MzJfdCkoaW5wdXRsZW5ndGgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICB9CiAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICB7CiAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CgogICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwoKICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgQUVTIENDTSBBdXRoZW50aWNhdGlvbiBUQUcgZ2VuZXJhdGlvbi4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIEF1dGhUYWc6IFBvaW50ZXIgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGJ1ZmZlcgogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUEV4X0FFU0NDTV9HZW5lcmF0ZUF1dGhUQUcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKkF1dGhUYWcsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CiAgdWludDMyX3QgY3RyMCBbNF0gPSB7MH07CiAgdWludDMyX3QgY3RyMGFkZHIgPSAodWludDMyX3QpY3RyMDsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CgogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwoKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwoKICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCiAgICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQogICAgewogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOwogICAgfQogICAgZWxzZSAvKiBJbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkKi8KICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0FVVEhfVEFHX1NFUVVFTkNFOwoKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CgojaWYgZGVmaW5lZChDUllQKQoKICAgIC8qIERpc2FibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICYgQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCB8IENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9QSEFTRV9GSU5BTCB8IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgIGRhdGEgaGFzIHRvIGJlIHN3YXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBEQVRBVFlQRSovCiAgICBjdHIwWzBdID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMDsKICAgIGN0cjBbMV0gPSBoY3J5cC0+SW5pdC5CMFsxXTsKICAgIGN0cjBbMl0gPSBoY3J5cC0+SW5pdC5CMFsyXTsKICAgIGN0cjBbM10gPSBoY3J5cC0+SW5pdC5CMFszXSAmICBDUllQX0NDTV9DVFIwXzM7CgogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICB9CiAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19PRk5FKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgQ2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBSZWFkIHRoZSBBdXRoIFRBRyBpbiB0aGUgSU4gRklGTyAqLwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKCiNlbHNlIC8qIEFFUyAqLwoKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgIGRhdGEgaGFzIHRvIGJlIHN3YXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBEQVRBVFlQRSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgY3RyMFswXSA9IChfX1JFVihoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzApOwogICAgICBjdHIwWzFdID0gX19SRVYoaGNyeXAtPkluaXQuQjBbMV0pOwogICAgICBjdHIwWzJdID0gX19SRVYoaGNyeXAtPkluaXQuQjBbMl0pOwogICAgICBjdHIwWzNdID0gKF9fUkVWKGhjcnlwLT5Jbml0LkIwWzNdKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgewogICAgICBjdHIwWzBdID0gKF9fUk9SKChoY3J5cC0+SW5pdC5CMFswXSksIDE2VSkmIENSWVBfQ0NNX0NUUjBfMCk7CiAgICAgIGN0cjBbMV0gPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsxXSksIDE2VSk7CiAgICAgIGN0cjBbMl0gPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsyXSksIDE2VSk7CiAgICAgIGN0cjBbM10gPSAoX19ST1IoKGhjcnlwLT5Jbml0LkIwWzNdKSwgMTZVKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgIHsKICAgICAgY3RyMFswXSA9IChfX1JCSVQoaGNyeXAtPkluaXQuQjBbMF0pJiBDUllQX0NDTV9DVFIwXzApOwogICAgICBjdHIwWzFdID0gX19SQklUKGhjcnlwLT5Jbml0LkIwWzFdKTsKICAgICAgY3RyMFsyXSA9IF9fUkJJVChoY3J5cC0+SW5pdC5CMFsyXSk7CiAgICAgIGN0cjBbM10gPSAoX19SQklUKGhjcnlwLT5Jbml0LkIwWzNdKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGN0cjBbMF0gPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wOwogICAgICBjdHIwWzFdID0gaGNyeXAtPkluaXQuQjBbMV07CiAgICAgIGN0cjBbMl0gPSBoY3J5cC0+SW5pdC5CMFsyXTsKICAgICAgY3RyMFszXSA9IGhjcnlwLT5Jbml0LkIwWzNdICYgIENSWVBfQ0NNX0NUUjBfMzsKCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgfQoKICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgQ2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKCiAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgojZW5kaWYgLyogRW5kIG9mIEFFUyB8fCBDUllQICovCgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogRGlzYWJsZSBDUllQICAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAfQogICovCgojaWYgZGVmaW5lZCAoQUVTKQovKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEtleSBEZXJpdmF0aW9uIGZ1bmN0aW9ucwogICogIEBicmllZiAgIEF1dG9LZXlEZXJpdmF0aW9uIGZ1bmN0aW9ucwogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgIyMjIyMgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIEVuYWJsZSBvciBEaXNhYmxlIHRoZQogICAgICAgICAgdGhlIEF1dG9LZXlEZXJpdmF0aW9uIHBhcmFtZXRlciBpbiBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbiBhcmUgYWxsb3dlZCBvbmx5IGluIFRpbnlBRVMgSVAuCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBBRVMgZW5hYmxlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9ucwogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkICBIQUxfQ1JZUEV4X0VuYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IEVOQUJMRTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgfQp9Ci8qKgogICogQGJyaWVmICBBRVMgZGlzYWJsZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbnMKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlLgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCAgSEFMX0NSWVBFeF9EaXNhYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID0gRElTQUJMRTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgfQp9CgovKioKICAqIEB9CiAgKi8KI2VuZGlmIC8qIEFFUyBvciBHQ00gQ0NNIGRlZmluZWQqLwojZW5kaWYgLyogQUVTICovCiNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLwoKLyoqCiAgKiBAfQogICovCiNlbmRpZiAvKiBUaW55QUVTIG9yIENSWVAqLwovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K