I2lmbmRlZiBTTk1QX1NZU1RFTV9ICiNkZWZpbmUgU05NUF9TWVNURU1fSAoKI2lmbmRlZiBORVRfU05NUF9DT05GSUdfSAojZXJyb3IgIlBsZWFzZSBpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4gYmVmb3JlIHRoaXMgZmlsZSIKI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkzIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBwb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCgogICAgLyoKICAgICAqIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhZW1vbi4gV2lsbCBmb3JrIGFuZCBjYWxsIHNldHNpZCgpLgogICAgICoKICAgICAqIFJldHVybnM6IC0xIDogZm9yayBmYWlsZWQKICAgICAqICAgICAgICAgICAwIDogTm8gZXJyb3JzCiAgICAgKi8KICAgIGludCBuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpOwoKICAgIC8qCiAgICAgKiBEZWZpbml0aW9ucyBmb3IgdGhlIHN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBmaWxlCiAgICAgKgogICAgICogRG8gbm90IGRlZmluZSAnc3RydWN0IGRpcmVjdCcgd2hlbiBNU1ZDX1BFUkwgaXMgZGVmaW5lZCBiZWNhdXNlIGEKICAgICAqIHN0cnVjdHVyZSB3aXRoIHRoYXQgbmFtZSBpcyBhbHNvIGRlZmluZWQgaW4gdGhlIFBlcmwgaGVhZGVyCiAgICAgKiBsaWJcQ09SRVxkaXJlbnQuaC4gRG8gbm90IGRlY2xhcmUgZ2V0dGltZW9mZGF5KCkgZWl0aGVyLgogICAgICovCiNpZm5kZWYgTVNWQ19QRVJMCgojaWZuZGVmIEhBVkVfUkVBRERJUgogICAgLyoKICAgICAqIHN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeSAKICAgICAqLwogICAgdHlwZWRlZiBzdHJ1Y3QgZGlyZWN0IHsKICAgICAgICBsb25nICAgICAgICAgICAgZF9pbm87ICAvKiBpbm9kZSBudW1iZXIgKG5vdCB1c2VkIGJ5IE1TLURPUykgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgZF9uYW1sZW47ICAgICAgIC8qIE5hbWUgbGVuZ3RoICovCiAgICAgICAgY2hhciAgICAgICAgICAgIGRfbmFtZVsyNTddOyAgICAvKiBmaWxlIG5hbWUgKi8KICAgIH0gX0RJUkVDVDsKCiAgICAvKgogICAgICogc3RydWN0dXJlIGZvciBkaXIgb3BlcmF0aW9ucyAKICAgICAqLwogICAgdHlwZWRlZiBzdHJ1Y3QgX2Rpcl9zdHJ1YyB7CiAgICAgICAgY2hhciAgICAgICAgICAgKnN0YXJ0OyAgLyogU3RhcnRpbmcgcG9zaXRpb24gKi8KICAgICAgICBjaGFyICAgICAgICAgICAqY3VycjsgICAvKiBDdXJyZW50IHBvc2l0aW9uICovCiAgICAgICAgbG9uZyAgICAgICAgICAgIHNpemU7ICAgLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUgKi8KICAgICAgICBsb25nICAgICAgICAgICAgbmZpbGVzOyAvKiBudW1iZXIgaWYgZmlsZW5hbWVzIGluIHRhYmxlICovCiAgICAgICAgc3RydWN0IGRpcmVjdCAgIGRpcnN0cjsgLyogRGlyZWN0b3J5IHN0cnVjdHVyZSB0byByZXR1cm4gKi8KICAgIH0gRElSOwoKICAgIERJUiAgICAgICAgICAgICpvcGVuZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgIHN0cnVjdCBkaXJlY3QgICpyZWFkZGlyKERJUiAqIGRpcnApOwogICAgaW50ICAgICAgICAgICAgIGNsb3NlZGlyKERJUiAqIGRpcnApOwojZW5kaWYgLyogSEFWRV9SRUFERElSICovCgojaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCiAgICBpbnQgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqdHopOwojZW5kaWYKCiNlbmRpZgkJCQkvKiBNU1ZDX1BFUkwgKi8KCiNpZm5kZWYgSEFWRV9TVFJOQ0FTRUNNUAogICAgaW50ICAgICAgICAgICAgIHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKICAgIGludCAgICAgICAgICAgICBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKI2VuZGlmCgojaWZkZWYgV0lOMzIKICAgIGNoYXIgICAgICAgICAgICp3aW5zb2NrX3N0YXJ0dXAodm9pZCk7CiAgICB2b2lkICAgICAgICAgICAgd2luc29ja19jbGVhbnVwKHZvaWQpOwojZGVmaW5lIFNPQ0tfU1RBUlRVUCB3aW5zb2NrX3N0YXJ0dXAoKQojZGVmaW5lIFNPQ0tfQ0xFQU5VUCB3aW5zb2NrX2NsZWFudXAoKQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFXSU4zMiAqLwojZGVmaW5lIFNPQ0tfU1RBUlRVUAojZGVmaW5lIFNPQ0tfQ0xFQU5VUAojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4gICAgIC8qIEZvciBkZWZpbml0aW9uIG9mIGluX2FkZHJfdCAqLwoKICAgIC8qIFNpbXBseSByZXNvbHZlIGEgaG9zdG5hbWUgYW5kIHJldHVybiBmaXJzdCBJUHY0IGFkZHJlc3MuCiAgICAgKiBSZXR1cm5zIC0xIG9uIGVycm9yICovCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9nZXRob3N0YnluYW1lX3Y0KGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqYWRkcl9vdXQpOwoKICAgIGluX2FkZHJfdCAgICAgICBnZXRfbXlhZGRyKHZvaWQpOwogICAgbG9uZyAgICAgICAgICAgIGdldF91cHRpbWUodm9pZCk7CgojaWZuZGVmIEhBVkVfU1RSRFVQCiAgICBjaGFyICAgICAgICAgICAqc3RyZHVwKGNvbnN0IGNoYXIgKik7CiNlbmRpZgojaWZuZGVmIEhBVkVfU0VURU5WCiAgICBpbnQgICAgICAgICAgICAgc2V0ZW52KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwojZW5kaWYKCiAgICBpbnQgICAgICAgICAgICAgY2FsY3VsYXRlX3RpbWVfZGlmZihzdHJ1Y3QgdGltZXZhbCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKik7CiAgICB1X2ludCAgICAgICAgICAgY2FsY3VsYXRlX3NlY3RpbWVfZGlmZihzdHJ1Y3QgdGltZXZhbCAqbm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnRoZW4pOwoKI2lmbmRlZiBIQVZFX1NUUkNBU0VTVFIKICAgIGNoYXIgICAgICAgICAgICpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJUT0wKICAgIGxvbmcgICAgICAgICAgICBzdHJ0b2woY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPVUwKICAgIHVuc2lnbmVkIGxvbmcgICBzdHJ0b3VsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJUT1VMTAogICAgTkVUU05NUF9JTVBPUlQgdWludDY0X3Qgc3RydG91bGwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPS19SCiAgICBjaGFyICAgICAgICAgICAqc3RydG9rX3IoY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NOUFJJTlRGCiAgICBpbnQgICAgICAgICAgICAgc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKI2VuZGlmCgogICAgaW50ICAgICAgICAgICAgIG1rZGlyaGllcihjb25zdCBjaGFyICpwYXRobmFtZSwgbW9kZV90IG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwbGFzdCk7CiAgICBjb25zdCBjaGFyICAgICAqbmV0c25tcF9ta3RlbXAodm9pZCk7CiNpZm5kZWYgSEFWRV9TVFJMQ1BZCiAgICBzaXplX3QgICAgICAgICAgICBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUkxDQVQKICAgIE5FVFNOTVBfSU1QT1JUCiAgICBzaXplX3QgICAgICAgICAgICBzdHJsY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwojZW5kaWYKCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9vc19wcmVtYXRjaChjb25zdCBjaGFyICpvc3BtbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9zcG1yZWxwcmVmaXgpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb3Nfa2VybmVsX3dpZHRoKHZvaWQpOwoKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3N0cl90b191aWQoY29uc3QgY2hhciAqdXNlcm9ydWlkKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3N0cl90b19naWQoY29uc3QgY2hhciAqZ3JvdXBvcmdpZCk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTk1QX1NZU1RFTV9IICovCg==