I2lmbmRlZiBTTk1QX1NZU1RFTV9ICiNkZWZpbmUgU05NUF9TWVNURU1fSAoKI2lmbmRlZiBORVRfU05NUF9DT05GSUdfSAojZXJyb3IgIlBsZWFzZSBpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4gYmVmb3JlIHRoaXMgZmlsZSIKI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkzIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBwb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCgogICAgLyoKICAgICAqIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhZW1vbi4gV2lsbCBmb3JrIGFuZCBjYWxsIHNldHNpZCgpLgogICAgICoKICAgICAqIFJldHVybnM6IC0xIDogZm9yayBmYWlsZWQKICAgICAqICAgICAgICAgICAwIDogTm8gZXJyb3JzCiAgICAgKi8KICAgIE5FVFNOTVBfSU1QT1JUCiAgICBpbnQgbmV0c25tcF9kYWVtb25pemUoaW50IHF1aXRfaW1tZWRpYXRlbHksIGludCBzdGRlcnJfbG9nKTsKCiAgICAvKgogICAgICogRGVmaW5pdGlvbnMgZm9yIHRoZSBzeXN0ZW0gZGVwZW5kZW50IGxpYnJhcnkgZmlsZQogICAgICoKICAgICAqIERvIG5vdCBkZWZpbmUgJ3N0cnVjdCBkaXJlY3QnIHdoZW4gTVNWQ19QRVJMIGlzIGRlZmluZWQgYmVjYXVzZSBhCiAgICAgKiBzdHJ1Y3R1cmUgd2l0aCB0aGF0IG5hbWUgaXMgYWxzbyBkZWZpbmVkIGluIHRoZSBQZXJsIGhlYWRlcgogICAgICogbGliXENPUkVcZGlyZW50LmguIERvIG5vdCBkZWNsYXJlIGdldHRpbWVvZmRheSgpIGVpdGhlci4KICAgICAqLwojaWZuZGVmIE1TVkNfUEVSTAoKI2lmbmRlZiBIQVZFX1JFQURESVIKICAgIC8qCiAgICAgKiBzdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnkgCiAgICAgKi8KICAgIHR5cGVkZWYgc3RydWN0IGRpcmVjdCB7CiAgICAgICAgbG9uZyAgICAgICAgICAgIGRfaW5vOyAgLyogaW5vZGUgbnVtYmVyIChub3QgdXNlZCBieSBNUy1ET1MpICovCiAgICAgICAgaW50ICAgICAgICAgICAgIGRfbmFtbGVuOyAgICAgICAvKiBOYW1lIGxlbmd0aCAqLwogICAgICAgIGNoYXIgICAgICAgICAgICBkX25hbWVbMjU3XTsgICAgLyogZmlsZSBuYW1lICovCiAgICB9IF9ESVJFQ1Q7CgogICAgLyoKICAgICAqIHN0cnVjdHVyZSBmb3IgZGlyIG9wZXJhdGlvbnMgCiAgICAgKi8KICAgIHR5cGVkZWYgc3RydWN0IF9kaXJfc3RydWMgewogICAgICAgIGNoYXIgICAgICAgICAgICpzdGFydDsgIC8qIFN0YXJ0aW5nIHBvc2l0aW9uICovCiAgICAgICAgY2hhciAgICAgICAgICAgKmN1cnI7ICAgLyogQ3VycmVudCBwb3NpdGlvbiAqLwogICAgICAgIGxvbmcgICAgICAgICAgICBzaXplOyAgIC8qIFNpemUgb2Ygc3RyaW5nIHRhYmxlICovCiAgICAgICAgbG9uZyAgICAgICAgICAgIG5maWxlczsgLyogbnVtYmVyIGlmIGZpbGVuYW1lcyBpbiB0YWJsZSAqLwogICAgICAgIHN0cnVjdCBkaXJlY3QgICBkaXJzdHI7IC8qIERpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gcmV0dXJuICovCiAgICB9IERJUjsKCiAgICBORVRTTk1QX0lNUE9SVAogICAgRElSICAgICAgICAgICAgKm9wZW5kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgTkVUU05NUF9JTVBPUlQKICAgIHN0cnVjdCBkaXJlY3QgICpyZWFkZGlyKERJUiAqIGRpcnApOwogICAgTkVUU05NUF9JTVBPUlQKICAgIGludCAgICAgICAgICAgICBjbG9zZWRpcihESVIgKiBkaXJwKTsKI2VuZGlmIC8qIEhBVkVfUkVBRERJUiAqLwoKI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQogICAgTkVUU05NUF9JTVBPUlQKICAgIGludCAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICp0eik7CiNlbmRpZgoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1TVkNfUEVSTCAqLwoKLyoKICogTm90ZTogd2hlbiBjb21waWxpbmcgTmV0LVNOTVAgd2l0aCBkbWFsbG9jIGVuYWJsZWQgb24gYSBzeXN0ZW0gd2l0aG91dAogKiBzdHJjYXNlY21wKCkgb3Igc3RybmNhc2VjbXAoKSwgdGhlIG1hY3JvIEhBVkVfU1RSTkNBU0VDTVAgaXMKICogbm90IGRlZmluZWQgYnV0IHN0cmNhc2VjbXAoKSBhbmQgc3RybmNhc2VjbXAoKSBhcmUgZGVmaW5lZCBhcyBtYWNyb3MgaW4KICogPGRtYWxsb2MuaD4uIEluIG9yZGVyIHRvIHByZXZlbnQgYSBjb21waWxhdGlvbiBlcnJvciwgZG8gbm90IGRlY2xhcmUKICogc3RyY2FzZWNtcCgpIG9yIHN0cm5jYXNlY21wKCkgd2hlbiB0aGUgPGRtYWxsb2MuaD4gaGVhZGVyIGhhcyBiZWVuIGluY2x1ZGVkLgogKi8KI2lmICFkZWZpbmVkKEhBVkVfU1RSTkNBU0VDTVApICYmICFkZWZpbmVkKHN0cmNhc2VjbXApCiAgICBORVRTTk1QX0lNUE9SVAogICAgaW50ICAgICAgICAgICAgIHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKI2VuZGlmCiNpZiAhZGVmaW5lZChIQVZFX1NUUk5DQVNFQ01QKSAmJiAhZGVmaW5lZChzdHJuY2FzZWNtcCkKICAgIE5FVFNOTVBfSU1QT1JUCiAgICBpbnQgICAgICAgICAgICAgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CiNlbmRpZgoKI2lmZGVmIFdJTjMyCiAgICBORVRTTk1QX0lNUE9SVAogICAgY2hhciAgICAgICAgICAgKndpbnNvY2tfc3RhcnR1cCh2b2lkKTsKICAgIE5FVFNOTVBfSU1QT1JUCiAgICB2b2lkICAgICAgICAgICAgd2luc29ja19jbGVhbnVwKHZvaWQpOwojZGVmaW5lIFNPQ0tfU1RBUlRVUCB3aW5zb2NrX3N0YXJ0dXAoKQojZGVmaW5lIFNPQ0tfQ0xFQU5VUCB3aW5zb2NrX2NsZWFudXAoKQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFXSU4zMiAqLwojZGVmaW5lIFNPQ0tfU1RBUlRVUAojZGVmaW5lIFNPQ0tfQ0xFQU5VUAojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4gICAgIC8qIEZvciBkZWZpbml0aW9uIG9mIGluX2FkZHJfdCAqLwoKICAgIC8qIFNpbXBseSByZXNvbHZlIGEgaG9zdG5hbWUgYW5kIHJldHVybiBmaXJzdCBJUHY0IGFkZHJlc3MuCiAgICAgKiBSZXR1cm5zIC0xIG9uIGVycm9yICovCiAgICBORVRTTk1QX0lNUE9SVAogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfZ2V0aG9zdGJ5bmFtZV92NChjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmFkZHJfb3V0KTsKCiAgICBORVRTTk1QX0lNUE9SVAogICAgaW5fYWRkcl90ICAgICAgIGdldF9teWFkZHIodm9pZCk7CiAgICBORVRTTk1QX0lNUE9SVAogICAgbG9uZyAgICAgICAgICAgIGdldF91cHRpbWUodm9pZCk7CgojaWZuZGVmIEhBVkVfU1RSRFVQCiAgICBjaGFyICAgICAgICAgICAqc3RyZHVwKGNvbnN0IGNoYXIgKik7CiNlbmRpZgojaWZuZGVmIEhBVkVfU0VURU5WCiAgICBORVRTTk1QX0lNUE9SVAogICAgaW50ICAgICAgICAgICAgIHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKI2VuZGlmCgogICAgTkVUU05NUF9JTVBPUlQKICAgIGludCAgICAgICAgICAgICBjYWxjdWxhdGVfdGltZV9kaWZmKGNvbnN0IHN0cnVjdCB0aW1ldmFsICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqKTsKICAgIE5FVFNOTVBfSU1QT1JUCiAgICB1X2ludCAgICAgICAgICAgY2FsY3VsYXRlX3NlY3RpbWVfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCAqbm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRoZW4pOwoKI2lmbmRlZiBIQVZFX1NUUkNBU0VTVFIKICAgIGNoYXIgICAgICAgICAgICpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJUT0wKICAgIGxvbmcgICAgICAgICAgICBzdHJ0b2woY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPVUwKICAgIHVuc2lnbmVkIGxvbmcgICBzdHJ0b3VsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJUT1VMTAogICAgTkVUU05NUF9JTVBPUlQgdWludDY0X3Qgc3RydG91bGwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPS19SCiAgICBORVRTTk1QX0lNUE9SVAogICAgY2hhciAgICAgICAgICAgKnN0cnRva19yKGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICoqKTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TTlBSSU5URgogICAgaW50ICAgICAgICAgICAgIHNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CiNlbmRpZgoKICAgIE5FVFNOTVBfSU1QT1JUCiAgICBpbnQgICAgICAgICAgICAgbWtkaXJoaWVyKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBsYXN0KTsKICAgIE5FVFNOTVBfSU1QT1JUCiAgICBjb25zdCBjaGFyICAgICAqbmV0c25tcF9ta3RlbXAodm9pZCk7CiNpZm5kZWYgSEFWRV9TVFJMQ1BZCiAgICBORVRTTk1QX0lNUE9SVAogICAgc2l6ZV90ICAgICAgICAgICAgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJMQ0FUCiAgICBORVRTTk1QX0lNUE9SVAogICAgc2l6ZV90ICAgICAgICAgICAgc3RybGNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKI2VuZGlmCgogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfb3NfcHJlbWF0Y2goY29uc3QgY2hhciAqb3NwbW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvc3BtcmVscHJlZml4KTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX29zX2tlcm5lbF93aWR0aCh2b2lkKTsKCiAgICBORVRTTk1QX0lNUE9SVAogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfc3RyX3RvX3VpZChjb25zdCBjaGFyICp1c2Vyb3J1aWQpOwogICAgTkVUU05NUF9JTVBPUlQKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3N0cl90b19naWQoY29uc3QgY2hhciAqZ3JvdXBvcmdpZCk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTk1QX1NZU1RFTV9IICovCg==