LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpZm5kZWYgQUdFTlRfSEFORExFUl9ICiNkZWZpbmUgQUdFTlRfSEFORExFUl9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyoqIEBmaWxlIGFnZW50X2hhbmRsZXIuaAogKgogKiAgQGFkZHRvZ3JvdXAgaGFuZGxlcgogKgogKiBAewogKi8KCnN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3M7CgovKgogKiBwZXIgbWliIGhhbmRsZXIgZmxhZ3MuCiAqIE5PVEU6IExvd2VyIGJpdHMgYXJlIHJlc2VydmVkIGZvciB0aGUgYWdlbnQgaGFuZGxlcidzIHVzZS4KICogICAgICAgVGhlIGhpZ2ggNCBiaXRzICgzMS0yOCkgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGhhbmRsZXIuCiAqLwojZGVmaW5lIE1JQl9IQU5ETEVSX0FVVE9fTkVYVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiNkZWZpbmUgTUlCX0hBTkRMRVJfQVVUT19ORVhUX09WRVJSSURFX09OQ0UgICAgIDB4MDAwMDAwMDIKI2RlZmluZSBNSUJfSEFORExFUl9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAoKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT000ICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAojZGVmaW5lIE1JQl9IQU5ETEVSX0NVU1RPTTMgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCiNkZWZpbmUgTUlCX0hBTkRMRVJfQ1VTVE9NMiAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT00xICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAoKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zIG5ldHNubXBfbWliX2hhbmRsZXIKICogVHlwZWRlZnMgdGhlIG5ldHNubXBfbWliX2hhbmRsZXJfcyBzdHJ1Y3QgaW50byAgbmV0c25tcF9taWJfaGFuZGxlciAqLwoKLyoqIEBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zCiAqICB0aGUgbWliIGhhbmRsZXIgc3RydWN0dXJlIHRvIGJlIHJlZ2lzdGVyZWQKICovCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyB7CiAgICAgICAgY2hhciAgICAgICAgICAgKmhhbmRsZXJfbmFtZTsKCS8qKiBmb3IgaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIHZvaWQgICAgICAgICAgICpteXZvaWQ7IAogICAgICAgIC8qKiBmb3IgYWdlbnRfaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIGludCAgICAgICAgICAgICBmbGFnczsKCiAgICAgICAgLyoqIGlmIHlvdSBhZGQgbW9yZSBtZW1iZXJzLCB5b3UgcHJvYmFibHkgYWxzbyB3YW50IHRvIHVwZGF0ZSAqLwogICAgICAgIC8qKiBfY2xvbmVfaGFuZGxlciBpbiBhZ2VudF9oYW5kbGVyLmMuICovCgkKICAgICAgICBpbnQgICAgICAgICAgICAgKCphY2Nlc3NfbWV0aG9kKSAoc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mb19zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zICopOwogICAgICAgIC8qKiBkYXRhIGNsb25lIGhvb2sgZm9yIG15dm9pZAogICAgICAgICAqICBkZWVwIGNvcHkgdGhlIG15dm9pZCBtZW1iZXIgLSBkZWZhdWx0IGlzIHRvIGNvcHkgdGhlIHBvaW50ZXIKICAgICAgICAgKiAgVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgaWYgbXl2b2lkICE9IE5VTEwKICAgICAgICAgKiAgbXl2b2lkIGlzIHRoZSBjdXJyZW50IG15dm9pZCBwb2ludGVyLgogICAgICAgICAqICByZXR1cm5zIE5VTEwgb24gZmFpbHVyZQogICAgICAgICAqLwogICAgICAgIHZvaWQgKigqZGF0YV9jbG9uZSkodm9pZCAqbXl2b2lkKTsKICAgICAgICAvKiogZGF0YSBmcmVlIGhvb2sgZm9yIG15dm9pZAogICAgICAgICAqICBkZWxldGUgdGhlIG15dm9pZCBtZW1iZXIgLSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKICAgICAgICAgKiAgVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgaWYgbXl2b2lkICE9IE5VTEwKICAgICAgICAgKi8KICAgICAgICB2b2lkICgqZGF0YV9mcmVlKSh2b2lkICpteXZvaWQpOyAvKio8IGRhdGEgZnJlZSBob29rIGZvciBteXZvaWQgKi8KCiAgICAgICAgc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyAqbmV4dDsKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zICpwcmV2Owp9IG5ldHNubXBfbWliX2hhbmRsZXI7CgovKgogKiBwZXIgcmVnaXN0cmF0aW9uIGZsYWdzCiAqLwojZGVmaW5lIEhBTkRMRVJfQ0FOX0dFVEFOREdFVE5FWFQgICAgIDB4MDEgICAgICAgLyogbXVzdCBiZSBhYmxlIHRvIGRvIGJvdGggKi8KI2RlZmluZSBIQU5ETEVSX0NBTl9TRVQgICAgICAgICAgICAgICAweDAyICAgICAgICAgICAvKiBpbXBsaWVzIGNyZWF0ZSwgdG9vICovCiNkZWZpbmUgSEFORExFUl9DQU5fR0VUQlVMSyAgICAgICAgICAgMHgwNAojZGVmaW5lIEhBTkRMRVJfQ0FOX05PVF9DUkVBVEUgICAgICAgIDB4MDggICAgICAgICAvKiBhdXRvIHNldCBpZiAhIENBTl9TRVQgKi8KI2RlZmluZSBIQU5ETEVSX0NBTl9CQUJZX1NURVAgICAgICAgICAweDEwCiNkZWZpbmUgSEFORExFUl9DQU5fU1RBU0ggICAgICAgICAgICAgMHgyMAoKCiNkZWZpbmUgSEFORExFUl9DQU5fUk9OTFkgICAoSEFORExFUl9DQU5fR0VUQU5ER0VUTkVYVCkKI2RlZmluZSBIQU5ETEVSX0NBTl9SV1JJVEUgIChIQU5ETEVSX0NBTl9HRVRBTkRHRVRORVhUIHwgSEFORExFUl9DQU5fU0VUKQojZGVmaW5lIEhBTkRMRVJfQ0FOX1NFVF9PTkxZIChIQU5ETEVSX0NBTl9TRVQgfCBIQU5ETEVSX0NBTl9OT1RfQ1JFQVRFKQojZGVmaW5lIEhBTkRMRVJfQ0FOX0RFRkFVTFQgKEhBTkRMRVJfQ0FOX1JPTkxZIHwgSEFORExFUl9DQU5fTk9UX0NSRUFURSkKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICogVHlwZWRlZnMgdGhlIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fcyBzdHJ1Y3QgaW50byBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICAqLwoKLyoqIEBzdHJ1Y3QgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zCiAqICBSb290IHJlZ2lzdHJhdGlvbiBpbmZvLgogKiAgVGhlIHZhcmlhYmxlcyBoYW5kbGVyTmFtZSwgY29udGV4dE5hbWUsIGFuZCByb290b2lkIG5lZWQgdG8gYmUgYWxsb2NhdGVkCiAqICBvbiB0aGUgaGVhcCwgd2hlbiB0aGUgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZSBpcyB1bnJlZ2lzdGVyZWQgdXNpbmcKICogIHVucmVnaXN0ZXJfbWliX2NvbnRleHQoKSB0aGUgY29kZSBhdHRlbXB0cyB0byBmcmVlIHRoZW0uCiAqLwp0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3MgewoKCS8qKiBmb3IgbXJUYWJsZSBsaXN0aW5ncywgYW5kIG90aGVyIHVzZXMgKi8KICAgICAgICBjaGFyICAgICAgICAgICAqaGFuZGxlck5hbWU7CgkvKiogTlVMTCA9IGRlZmF1bHQgY29udGV4dCAqLwogICAgICAgIGNoYXIgICAgICAgICAgICpjb250ZXh0TmFtZTsgICAgCgogICAgICAgIC8qKgogICAgICAgICAqIHdoZXJlIGFyZSB3ZSByZWdpc3RlcmVkIGF0PyAKICAgICAgICAgKi8KICAgICAgICBvaWQgICAgICAgICAgICAqcm9vdG9pZDsKICAgICAgICBzaXplX3QgICAgICAgICAgcm9vdG9pZF9sZW47CgogICAgICAgIC8qKgogICAgICAgICAqIGhhbmRsZXIgZGV0YWlscyAKICAgICAgICAgKi8KICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyOwogICAgICAgIGludCAgICAgICAgICAgICBtb2RlczsKCiAgICAgICAgLyoqCiAgICAgICAgICogbW9yZSBvcHRpb25hbCBzdHVmZiAKICAgICAgICAgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgcHJpb3JpdHk7CiAgICAgICAgaW50ICAgICAgICAgICAgIHJhbmdlX3N1YmlkOwogICAgICAgIG9pZCAgICAgICAgICAgICByYW5nZV91Ym91bmQ7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRpbWVvdXQ7CiAgICAgICAgaW50ICAgICAgICAgICAgIGdsb2JhbF9jYWNoZWlkOwoKICAgICAgICAvKioKICAgICAgICAgKiB2b2lkIHB0ciBmb3IgcmVnaXN0ZXJlZQogICAgICAgICAqLwogICAgICAgIHZvaWQgKiAgICAgICAgICBteV9yZWdfdm9pZDsKCn0gbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbjsKCi8qCiAqIGZ1bmN0aW9uIGhhbmRsZXIgZGVmaW5pdGlvbnMgCiAqLwoKdHlwZWRlZiBpbnQgKE5ldHNubXBfTm9kZV9IYW5kbGVyKSAobmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlciwKICAgIC8qKiBwb2ludGVyIHRvIHJlZ2lzdHJhdGlvbiBzdHJ1Y3QgKi8KICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAvKiogcG9pbnRlciB0byBjdXJyZW50IHRyYW5zYWN0aW9uICovCiAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAqcmVxaW5mbywKICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cyk7CgogICAgdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9oYW5kbGVyX2FyZ3NfcyB7CiAgICAgICAgbmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlcjsKICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvOwogICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvOwogICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0czsKICAgIH0gbmV0c25tcF9oYW5kbGVyX2FyZ3M7CgogICAgdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGVfcyB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRyYW5zYWN0aW9uX2lkOwogICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXI7CiAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbzsKICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAqcmVxaW5mbzsKICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHM7CiAgICAgICAgdm9pZCAgICAgICAgICAgKmxvY2FsaW5mbzsKICAgIH0gbmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGU7CgogICAgLyoKICAgICAqIGhhbmRsZXIgQVBJIGZ1bmN0aW9ucyAKICAgICAqLwogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfaW5pdF9oYW5kbGVyX2NvbmYodm9pZCk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9yZWdpc3Rlcl9oYW5kbGVyKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8pOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfdW5yZWdpc3Rlcl9oYW5kbGVyKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICBpbnQgICAgICAgICAgICAKICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXJfbm9jYWxsYmFjayhuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8pOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfaW5qZWN0X2hhbmRsZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyKTsKICAgIGludAogICAgICAgIG5ldHNubXBfaW5qZWN0X2hhbmRsZXJfYmVmb3JlKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiZWZvcmVfd2hhdCk7CiAgICBuZXRzbm1wX21pYl9oYW5kbGVyCiAgICAgICAgKm5ldHNubXBfZmluZF9oYW5kbGVyX2J5X25hbWUobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKICAgIHZvaWQgICAgICAgICAgCiAgICAgICAgKm5ldHNubXBfZmluZF9oYW5kbGVyX2RhdGFfYnlfbmFtZShuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywgY29uc3QgY2hhciAqbmFtZSk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX2hhbmRsZXJzKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfY2FsbF9oYW5kbGVyKG5ldHNubXBfbWliX2hhbmRsZXIgKm5leHRfaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpOwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfY2FsbF9uZXh0X2hhbmRsZXIobmV0c25tcF9taWJfaGFuZGxlciAqY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0cyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX25leHRfaGFuZGxlcl9vbmVfcmVxdWVzdChuZXRzbm1wX21pYl9oYW5kbGVyICpjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzKTsKICAgIAogICAgbmV0c25tcF9taWJfaGFuZGxlciAqbmV0c25tcF9jcmVhdGVfaGFuZGxlcihjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRzbm1wX05vZGVfSGFuZGxlciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfYWNjZXNzX21ldGhvZCk7CiAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICoKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogcmVnX29pZCwgc2l6ZV90IHJlZ19vaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGVzKTsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKgogICAgbmV0c25tcF9jcmVhdGVfaGFuZGxlcl9yZWdpc3RyYXRpb24oY29uc3QgY2hhciAqbmFtZSwgTmV0c25tcF9Ob2RlX0hhbmRsZXIqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX2FjY2Vzc19tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKnJlZ19vaWQsIHNpemVfdCByZWdfb2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2Rlcyk7CgogICAgbmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGUKICAgICAgICAqbmV0c25tcF9jcmVhdGVfZGVsZWdhdGVkX2NhY2hlKG5ldHNubXBfbWliX2hhbmRsZXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqLCB2b2lkICopOwogICAgdm9pZCBuZXRzbm1wX2ZyZWVfZGVsZWdhdGVkX2NhY2hlKG5ldHNubXBfZGVsZWdhdGVkX2NhY2hlICpkY2FjaGUpOwogICAgbmV0c25tcF9kZWxlZ2F0ZWRfY2FjaGUKICAgICAgICAqbmV0c25tcF9oYW5kbGVyX2NoZWNrX2NhY2hlKG5ldHNubXBfZGVsZWdhdGVkX2NhY2hlICpkY2FjaGUpOwogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKik7CgogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfY2xlYXJfaGFuZGxlcl9saXN0KHZvaWQpOwoKICAgIHZvaWQKICAgICAgICBuZXRzbm1wX3JlcXVlc3RfYWRkX2xpc3RfZGF0YShuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RhdGFfbGlzdCAqbm9kZSk7CiAgICBpbnQgbmV0c25tcF9yZXF1ZXN0X3JlbW92ZV9saXN0X2RhdGEobmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CgogICAgaW50CiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X3JlbW92ZV9saXN0X2RhdGEobmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CgogICAgdm9pZCAgICAqbmV0c25tcF9yZXF1ZXN0X2dldF9saXN0X2RhdGEobmV0c25tcF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKCiAgICB2b2lkCiAgICAgICAgICAgICAgbmV0c25tcF9mcmVlX3JlcXVlc3RfZGF0YV9zZXQobmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3QpOwoKICAgIHZvaWQKICAgICAgICAgICAgIG5ldHNubXBfZnJlZV9yZXF1ZXN0X2RhdGFfc2V0cyhuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCk7CgogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9mcmVlKG5ldHNubXBfbWliX2hhbmRsZXIgKik7CiAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpuZXRzbm1wX2hhbmRsZXJfZHVwKG5ldHNubXBfbWliX2hhbmRsZXIgKik7CiAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgKm5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fZHVwKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKik7CiAgICB2b2lkICAgICAgICAgICAKICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2ZyZWUobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqKTsKCiNkZWZpbmUgUkVRVUVTVF9JU19ERUxFR0FURUQgICAgIDEKI2RlZmluZSBSRVFVRVNUX0lTX05PVF9ERUxFR0FURUQgMAogICAgdm9pZCAgICAgICAgICAgCiAgICAgICAgbmV0c25tcF9oYW5kbGVyX21hcmtfcmVxdWVzdHNfYXNfZGVsZWdhdGVkKG5ldHNubXBfcmVxdWVzdF9pbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCk7CiAgICB2b2lkICAgICAgICAgICAqbmV0c25tcF9oYW5kbGVyX2dldF9wYXJlbnRfZGF0YShuZXRzbm1wX3JlcXVlc3RfaW5mbyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBR0VOVF9IQU5ETEVSX0ggKi8KLyoqIEB9ICovCg==